2017-07-04 310 views
0

我有一个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++中有没有其他的函数?

+1

你正在尝试解析不是一个CSV。 CSV语法由[RFC4180](https://tools.ietf.org/html/rfc4180)定义,文档的第一点指出:“每条记录位于一个单独的行上,由换行符(CRLF) ' –

+0

单元格内的双引号怎么样? – DAle

+0

@SimoneCifani我使用的csv文件是由PHP创建的。另外,我已经通过excel和Libreoffice创建了逗号分隔的csv文件,但仍然看到了相同的结果。 – Aref

回答

1

@Simone在他的评论中已经说过,它不是CSV文件。但是看到你的问题,你需要把你的手弄脏,并做一些文字处理来分开。你可以读完一个字符串中的完整文件,然后用循环或者你认为合适的方法进一步分解它。对于这一点,你需要保持跟踪的遭遇“而穿越,只有突破时,它不是双引号。

例如,

(打开引号)”行1个单元1 随着断线” (关闭撇号),“(开撇号)Row1 cell2,用逗号”(关闭撇号)

您将不得不跟踪使用索引或数字打开和关闭双撇号,只有在'\ n'被发现在开头和撇号之外

你可以使用正则表达式a如果你确定在细胞中没有“。

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

+0

感谢您的建议。是的,我认为我最后必须自己解析:/!考虑到问题的一般性,你会知道像Boost这样的库中的任何函数都可以做到这一点,因为编辑器创建的每个以逗号分隔的csv文件都具有这种格式 – Aref

+0

您可以编写一次该函数并在需要解析时使用它;)我不确定如果boost有任何这样的功能,但如果它没有你可以在那里贡献,如果你可以使它通用。 – vijaykrishnavanshi

+0

阅读此。这应该有所帮助。 链接:http://mybyteofcode.blogspot.in/2010/02 /语法分析的CSV文件与 - 升压记号化r-in.html – vijaykrishnavanshi

1

你必须完全分开",保持2个状态:在""之内和外部。基于状态,,EOL具有不同的含义。

您可以使用getline(file, rowStr, '"')来读取所有内容,直到",但是在记录中分离的逻辑会稍微复杂一些。如果数字不带引号,则会变得更加复杂。

+0

感谢您的建议。但问题是,当一个单元格不包含特殊字符如“\ n”和“,”时,它没有用双引号(“)括起来。我该如何处理这种情况?在PHP中,我正确地获取内容我想知道为什么在C++中没有其他选择! – Aref

相关问题