在qt中用C++创建.csv文件

9
我希望使用C++和Qt应用程序和UI框架创建一个csv文件。是否有专门用于csv文件的库?

2
创建一个CSV写入器就像完成一项高中家庭作业一样困难。 - RobbieE
3
当然,如果要将其用于高中作业以外的用途,那么它就不再是如此简单了... - Kuba hasn't forgotten Monica
C CSV解析器:http://sourceforge.net/projects/cccsvparser C CSV编写器:http://sourceforge.net/projects/cccsvwriter - SomethingSomething
3
那又怎样,即使是一个琐碎的问题?每个人都从零开始学习。如果你不想帮助提问者,那就走开好了。 - GeneCode
3个回答

4

尝试使用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文件以获取库的文档和其他代码示例。

1
所以我尝试了这段代码:QStringList strList; strList << "one" << "two" << "three" << "with,comma";,但是在文件中得到的是one,two,three,with,comma而不是one,two,three,"with,comma",我是正确使用它还是库无法处理这么简单的事情? - Jablonski
@Chernobyl 嗯,看起来这是库中的一个错误。我会尝试修复它。作为解决方法,请尝试使用不同的分隔符号(例如,使用分号“;”)。 - iamantony
好的,如果修复了,请通知我。我点赞是因为这个库非常有趣,但这个bug几乎让它变得无用了。如果有一个好的修复,它会变得更好。 - Jablonski
请在 GitHub 上检查最新版本的 @Chernobyl。 - iamantony

1
你可以基本上查看 libqxt

使用 QxtCsvModel

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

csvmodel->setSource(fileName);

1

只是写CSV文件吗?虽然谷歌可能会显示一些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 "\"\""
}

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

2
考虑到您的“escape”函数存在严重的错误,我敢说这并不是那么琐碎 :( - Kuba hasn't forgotten Monica
1
好的,那么这个CSV文件使用的是什么文本编码呢? :) 当所有的事情都说完了,对于一个通用、健壮的实现,你需要一个经过测试和现场验证的库。自己编写的方法只适用于最简单的数据。 - Kuba hasn't forgotten Monica
谢谢。今天是逻辑漏洞的日子。这表明您也应该检查“简单”和“显而易见”的事情。 - rioki
3
事实上,只有在处理纯数字时编写CSV才是微不足道的。但是,在此之后,情况会迅速变得复杂起来。要对实现有任何信心,还需要编写测试以覆盖所有可能出现的极端情况,这些情况非常多,更不用说手动测试以确保其他应用程序正确加载这些极端情况。使用现有的库可以让你假装有人已经完成了这个工作 ;) - hyde
CSV文件通过将引号加倍而不是在引号前加反斜杠来转义它们。http://tools.ietf.org/html/rfc4180 - Michael Burr
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接