【问题标题】:Create .csv file in C++ in qt在 qt 中用 C++ 创建 .csv 文件
【发布时间】:2014-05-13 04:58:32
【问题描述】:

我想使用 c++ 创建一个 csv 文件,将 Qt 用于应用程序和 UI 框架。是否有用于 csv 文件的库。

【问题讨论】:

  • 创建 CSV 编写器与高中家庭作业一样困难。
  • @RobbieE 当然,如果它可以在高中家庭作业之外使用,它就不再那么微不足道了......
  • 如果这是一个微不足道的问题怎么办?大家从0开始学习,不想帮OP就滚蛋吧。

标签: c++ qt qt4 export-to-csv qtcore


【解决方案1】:

尝试使用qtcsv 库来读取和写入 csv 文件。示例:

#include <QList>
#include <QStringList>
#include <QDir>
#include <QDebug>

#include "qtcsv/stringdata.h"
#include "qtcsv/reader.h"
#include "qtcsv/writer.h"

int main()
{
    // prepare data that you want to save to csv-file
    QStringList strList;
    strList << "one" << "two" << "three";

    QtCSV::StringData strData;
    strData.addRow(strList);
    strData.addEmptyRow();
    strData << strList << "this is the last row";

    // write to file
    QString filePath = QDir::currentPath() + "/test.csv";
    QtCSV::Writer::write(filePath, strData);

    // read data from file
    QList<QStringList> readData = QtCSV::Reader::readToList(filePath);
    for ( int i = 0; i < readData.size(); ++i )
    {
        qDebug() << readData.at(i).join(",");
    }

    return 0;
}

我试图让它变得小巧易用。有关库文档和其他代码示例,请参见 Readme 文件。

【讨论】:

  • 所以我尝试了这段代码:QStringList strList;strList &lt;&lt; "one" &lt;&lt; "two" &lt;&lt; "three" &lt;&lt; "with,comma"; 并在文件中得到了one,two,three,with,comma 而不是one,two,three,"with,comma",是我使用正确还是lib 无法处理这么简单的事情?跨度>
  • @Chernobyl 好吧,看来这是图书馆的错误。将尝试修复它。作为一种解决方法,请尝试使用不同的分隔符(例如,使用分号“;”)。
  • 好的,通知我,如果会被修复,赞成,因为 lib 很有趣,但是这个错误使它几乎没用,如果修复得好会更好。
  • @Chernobyl checkout GitHub 上的最新版本
【解决方案2】:

只写 CSV?尽管 google 可能会显示一些 CSV 库,但您没有找到的可能原因是因为它太琐碎了。记住 CSV 只是逗号分隔的值。

要实现它,请使用任何方式编写文本文件(std::ofstream、QFile、QTextStream)并执行以下操作:

foreach record
{
  foreach value in record
  {
    write "\"" + escape(value) + "\""
    if not last value in record
    {
      write ","
    }        
  }
  write "\n"
}


escape (value)
{
  replace each "\"" with "\"\""
}

请注意,如果值不包含任何分隔符 (,),您可以编写不带引号的值。另请注意,您可以使用不同的分隔符,例如常用的分号。

【讨论】:

  • 鉴于您在escape 函数中存在严重错误,我敢说这不是那么微不足道:(
  • 承认这是一个疏忽......但它仍然是微不足道的。
  • 好的,那么这个 CSV 文件是用什么文本编码编写的? :) 说到底,对于一个通用的、健壮的实现,您需要一个经过测试和现场验证的库。自制方法仅适用于最简单的数据。
  • 你的write "\n" 放错了位置,把它移下一行
  • 确实,写 CSV 只是简单的数字,只要它是纯数字。在那之后,事情开始迅速变得复杂。并且要对实现有任何信心,它还需要覆盖所有极端情况的测试,这些情况很多,更不用说手动测试以查看其他应用程序也正确加载极端情况。现有的图书馆将允许假装其他人已经这样做了;)
【解决方案3】:

你基本上可以看看libqxt

使用 QxtCsvModel

QxtCsvModel [libqxt.bitbucket.org] 类为 CSV 文件提供了一个 QAbstractTableModel [qt-project.org]。这可能是读取和写入 csv 文件的最简单方法,而无需将 csv 格式解析为 qt 可以理解的格式。就像使用一行代码一样简单,例如下面读取csv文件:

csvmodel->setSource(fileName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多