如何在C++中使用换行符和逗号字符读取CSV文件
我有一个CSV文件,其中包含带有折线(“\ n”)的单元格和/或用双引号括起来的逗号。 当我使用getline()函数获取每一行时,它将单元格内的每一行视为csv文件的新行。另外,当使用splitIntoVec获取每一行的向量时,它将一个单元格内的逗号作为一个新的向量元素进行调整。 我想将csv文件的内容存储到向量中,每行是其单元格内的字符串向量。如何在C++中使用换行符和逗号字符读取CSV文件
例如,对于以下csv文件内容
"Row 1 cell 1
With break line","Row1 cell2, with comma"
"Row 2 cell 1
With break line","Row2 cell2, with comma"
Row 3 cell 1,Row3 cell 2
我得到4个矢量的结果矢量,其第一个仅具有一个元素,第二个具有3个元件。 这里是我的代码:
vector<vector<string>> readFromCsv(string &fileName, char rowDelimiter = "\n", char colDelimiter = ",") {
ifstream file(fileName); // declare file stream
string value;
vector<vector<string>> contentVec;
vector<string> rowVec;
string rowStr;
while (getline(file, rowStr, rowDelimiter)) {
rowVec = splitIntoVec(rowStr, colDelimiter);
contentVec.push_back(rowVec);
}
return contentVec;
}
是否有任何其他功能(像Boost库),可用于解决这些问题?任何帮助,将不胜感激。
在PHP中,我通过fgetcsv()正确获取csv文件的内容。在C++中有没有其他的函数?
@Simone在他的评论中已经说过,它不是CSV文件。但是看到你的问题,你需要把你的手弄脏,并做一些文字处理来分开。你可以读完一个字符串中的完整文件,然后用循环或者你认为合适的方法进一步分解它。对于这一点,你需要保持跟踪的遭遇“而穿越,只有突破时,它不是双引号。
例如,
(打开引号)”行1个单元1 随着断线” (关闭撇号),“(开撇号)Row1 cell2,用逗号”(关闭撇号)
您将不得不跟踪使用索引或数字打开和关闭双撇号,只有在'\ n'被发现在开头和撇号之外
你可以使用正则表达式a如果你确定在细胞中没有“。
感谢,如果别人面临着同样的问题@Alex有用的链接:http://mybyteofcode.blogspot.nl/2010/11/parse-csv-file-with-embedded-new-lines.html
感谢您的建议。是的,我认为我最后必须自己解析:/!考虑到问题的一般性,你会知道像Boost这样的库中的任何函数都可以做到这一点,因为编辑器创建的每个以逗号分隔的csv文件都具有这种格式 – Aref
您可以编写一次该函数并在需要解析时使用它;)我不确定如果boost有任何这样的功能,但如果它没有你可以在那里贡献,如果你可以使它通用。 – vijaykrishnavanshi
阅读此。这应该有所帮助。 链接:http://mybyteofcode.blogspot.in/2010/02 /语法分析的CSV文件与 - 升压记号化r-in.html – vijaykrishnavanshi
你必须完全分开"
,保持2个状态:在""
之内和外部。基于状态,,
和EOL
具有不同的含义。
您可以使用getline(file, rowStr, '"')
来读取所有内容,直到"
,但是在记录中分离的逻辑会稍微复杂一些。如果数字不带引号,则会变得更加复杂。
感谢您的建议。但问题是,当一个单元格不包含特殊字符如“\ n”和“,”时,它没有用双引号(“)括起来。我该如何处理这种情况?在PHP中,我正确地获取内容我想知道为什么在C++中没有其他选择! – Aref
你正在尝试解析不是一个CSV。 CSV语法由[RFC4180](https://tools.ietf.org/html/rfc4180)定义,文档的第一点指出:“每条记录位于一个单独的行上,由换行符(CRLF) ' –
单元格内的双引号怎么样? – DAle
@SimoneCifani我使用的csv文件是由PHP创建的。另外,我已经通过excel和Libreoffice创建了逗号分隔的csv文件,但仍然看到了相同的结果。 – Aref