C++ 读取引用的CSV数据,不使用换行符作为结束行

C++ 读取引用的CSV数据,不使用换行符作为结束行,c++,qt,csv,C++,Qt,Csv,我试图读入一个文件时遇到了问题,我不知道如何解决它 该文件是CSV,但文件文本中也有逗号,因此逗号周围有引号表示新值 例如: "1","hello, ""world""","and then this" // In text " is written as "" 我想知道如何使用QFileStream处理报价(尽管我也没有看到基本解决方案) 此外,另一个问题是,我也不能逐行阅读,因为在这些引用中可能有新行 在R中,有一个选项quotes=”“,可以解决这些问题

我试图读入一个文件时遇到了问题,我不知道如何解决它

该文件是CSV,但文件文本中也有逗号,因此逗号周围有引号表示新值

例如:

"1","hello, ""world""","and then this"  // In text " is written as ""
我想知道如何使用
QFileStream
处理报价(尽管我也没有看到基本解决方案)

此外,另一个问题是,我也不能逐行阅读,因为在这些引用中可能有新行

在R中,有一个选项
quotes=”“
,可以解决这些问题

<一定有C++的东西。它是什么?

您可以按引号拆分(不仅仅是引号,还有任何符号,例如“\”符号)qt中的符号,只需将
\
放在前面,例如:
字符串。拆分(\”);
将按
符号拆分
字符串

下面是一个简单的控制台应用程序,用于拆分文件(最简单的解决方案是按“,”符号拆分):


谷歌搜索之后,我找到了一些现成的解决方案。看看。

你试过什么?当然,你的问题和我的一样POV@nyarlathotep一个标准的CSV文档(正如我所看到的)有
separator=,
end-of-line=\n
。在本例中,使用引号允许出现这些字符。在这方面是不同的:我不能简单地使用这些方法读取文件。@nyarlathotep同样,在第一个链接中,他们明确提到对这种情况不感兴趣。引用也在标准中。你应该更彻底地检查相关问题;在(第二个)问题中链接的库可以处理这个(,),而我尝试的是正常地读取它,用逗号和所有这些来拆分它。这不起作用,我需要能够指示一些引号设置,但我找不到它。这是cvs,因此您的代码将在这一行失败:
无引号,““qute with”“quote”“”
(有两个问题:没有引号,它包含
”,“
”在值中)@MarekR(不是cvs,csv是逗号分隔的值)-事实上,在这些情况下,它将失败,这是显而易见的,我只是假设,根据给出的示例判断,所有值都放在引号中。在这种情况下,如果值内有“
”,“
”,则无论如何都无法进行筛选(您如何知道,值内有什么逗号,引号中两个值之间有什么逗号)。不管怎么说,主要的一点是展示,它是如何被
分割的“
symbols,这个程序只是为了展示如何使用它。如果文本格式将被指定,我会相应地编辑文章,现在看来这是作者想要的,我不理解输出;我正在寻找一种解决方案,它只计算一行。@duality再次读取行
QString(file.readAll()).split(“\”,\”,QString::skipmptyparts)它是按
“,”
字符串拆分的,而不仅仅是按逗号拆分。输出很简单。读取的每一个值都打印在新行上。@Duality那么,您想要一个简单的解决方案来读取这个csv文件,而不是让它发挥作用,您决定下载、编译、添加到project巨型lirary来读取文件?好吧,这取决于你的决定,decideqxt是巨大的,而仅仅为了解析简单的csv而包含和构建这个库对我来说似乎是一种浪费。虽然我错了,如果文件格式差异很大,那么一些csv库确实会很方便。@Shf我声明我更喜欢Qt中的解决方案。@duality libqxt不是Qt。这是另一个独立的图书馆吗。在Qt中,将其添加到项目中肯定不是一个解决方案。可能是不必要的依赖性该实现似乎一次加载所有带有
file.readAll()
的行,对于大文件不太推荐。是的,我对此感到难过。我现在面对的是200万行,也就是3gb的数据。
// opening file split.csv, in this case in the project folder
QFile file("split.csv");
file.open(QIODevice::ReadOnly);
// flushing out all of it's contents to stdout, just for testing
std::cout<<QString(file.readAll()).toStdString()<<std::endl;
// reseting file to read again
file.reset();
// reading all file to QByteArray, passing it to QString consructor, 
// splitting that string by "," string and putting it to QStringList list
// where every element of a list is value from cell in csv file
QStringList list=QString(file.readAll()).split("\",\"",QString::SkipEmptyParts);

// adding back quotes, that was taken away by split
for (int i=0; i<list.size();i++){
    if (i!=0) list[i].prepend("\"");
    if (i!=(list.size()-1)) list[i].append("\"");
}//*/
// flushing results to stdout
foreach (QString i,list)    std::cout<<i.toStdString()<<std::endl; // not using QDebug, becouse it will add more quotes to output, which is already confusing enough
"1"
"hello, ""world"""
"and then this"