如何在C ++中使用单元格内的换行符和逗号字符读取CSV文件

时间:2017-07-04 07:01:53

标签: c++ csv vector

我有一个CSV文件,其中包含带有折线(“\ n”)和/或用双引号括起来的逗号的单元格。 当我使用getline()函数获取每一行时,它会将单元格内的每一行视为csv文件的新行。此外,当使用splitIntoVec获取每行的向量时,它会将单元格内的逗号作为新的向量元素进行转换。 我想将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 ++中有替代函数吗?

2 个答案:

答案 0 :(得分:1)

您必须完全按Elasticsearch 5.4分隔,保留2个状态:在"内外。 "",根据州有不同的含义。

您可以使用EOL读取getline(file, rowStr, '"')以外的所有内容,但您在记录中分隔的逻辑会更复杂一些。如果允许数字不带引号,那么它就会变得更加复杂。

答案 1 :(得分:1)

@Simone在评论中已经说过它不是CSV文件。但是看到你的问题,你需要弄脏你的手并进行一些文本处理才能将它分开。您可以读取字符串中的完整文件,然后使用循环或您认为合适的方式进一步分解。为此,您需要跟踪遇到的情况。只有当它不在双引号内时才会穿越和断开。

例如,

(开放撇号)&#34;第1行单元格1  使用折断线&#34;(关闭撇号),&#34;(打开撇号)Row1 cell2,用逗号&#34;(关闭撇号)

您必须使用索引或数字跟踪打开和关闭双撇号,并且只有在&#39; \ n&#39;在开始和结束的撇号之外被发现。

如果您确定没有&#34;也可以使用正则表达式。在细胞中。

感谢@Alex有用的链接,如果其他人遇到同样的问题:http://mybyteofcode.blogspot.nl/2010/11/parse-csv-file-with-embedded-new-lines.html