在.csv文件中读取C++

问题描述:

我试图读取一个.csv文件,该文件中充满了我有的程序的字符串。我编写了下面的代码来尝试读取每个单独的字符串。在.csv文件中读取C++

string read_from_f(istream &in) { 

string a; 
char fill = '0'; 

while (fill != ',') { 
    in.get(fill); 

    if (fill != ',') { 
     a += fill; 
    } 
} 

return a; 
} 

这结束了不工作,因为我的一些字符串中都有逗号和结构都像这样。 “........”,“唐纳德,特朗普”,“.....”

当我调查我的本地人时,in.get()没有读取双来自每个字符串的引号。有没有一种方法可以从引号读到引号,以便我不会收到任何意外的错误?

+1

如果您确定每个数据值都是字符串,那么为什么不直读,直到您使用双引号作为分隔符而不是逗号?然后,你只需要忽略其他所有结果(这将只是一个逗号),并且你将拥有一切 – scohe001

+1

您需要编写或至少使用一个正确的CSV解析器 - 我在https://处有一个bitbucket.org/neilb/csvparse/src - 你不能简单地使用C++标准库工具来完成这项工作。 –

+1

制作一个[预约您的橡皮鸭](https://en.wikipedia.org/wiki/Rubber_duck_debugging)来解释您提出的解析CSV文件的算法。在获得橡皮鸭的批准之前,不要尝试写另一行代码。 –

正如scohe001所建议的那样,如果您的csv仅由字符串组成,每个字符串都用双引号括起来,一个简单的解决方案是使用双引号作为分隔符并考虑提供的每个第二个值。读,直到分隔符可以方便地与getline来实现:

#include <iostream> 

int main() 
{ 
    ifstream f(DATAFILE); 
    if (!f.is_open()) { 
     cout << "error opening file." << endl; 
     return 1; 
    } 
    string content; 
    int count = 0; 
    while(std::getline(f, content, '"')) { 
     if (count%2 != 0) { // every second entry is actual content 
      cout << content << endl; 
     } 
     count++; 
    } 
    return 0; 
} 

于是我想出了一个简单的解决方案。我将我的.csv文件更改为.txt文件,而不是检查逗号,我检查了引号。当文件是.txt文件时,我的in.get()能够读取引号。