C ++读取CSV文件,避免使用新行字符

时间:2014-03-14 10:00:49

标签: c++ csv newline

我有一个关于在C ++中阅读CSV文件内容的问题。 基本上我有一个包含以CSV格式保存的数据的磁贴。我想要做的是能够读取这些数据并将内存中的所有内容分配到矩阵上,或将每列分隔成一个单独的向量。

我要做的第一件事是,获取行数并在consolle上打印内容。

我通过getline(流,行,分隔符)执行此操作:

if(myFile.is_open())
{
   while(!myFile.eof())
   {
      std::getline(myFile, line, ',');
      std::cout << n_Lines << ") " << line << std::endl;
      n_Lines = n_Lines + 1;
   }
}

现在的问题是,解析以这种方式将逗号作为分隔符,但将/ n(换行符)考虑在内并将其附加到行的每个最后一个数字:

198) 86
199) 47
46
200) 53
201) 58
202) 4
203) 62
204) 90
205) 98
206) 58
207) 39
208) 4
34
209) 70
210) 58
211) 33
212) 8
213) 73
214) 20
215) 61
216) 9
217) 76
6
218) 22

在这个cas中,n_nines应该对元素进行计数,但是每十个元素一次,两个数字就会被整合在一起作为整个字符串。

如何避免这种情况并正确解析我的文件?有没有更有效的方法来执行此操作并将我的数据直接保存到矩阵中?

谢谢,  吉奥

3 个答案:

答案 0 :(得分:0)

除了找到一个能够处理CSV文件的合适的库,比你或我在短时间内想出的任何东西都要好得多,你可以这样做:

将每一行读入一个字符串。将该字符串放在input string stream中。从此输入流中读取每个以逗号分隔的字符串。

答案 1 :(得分:0)

如果在开始阅读文件之前已知列数,则以下代码应该起作用:

const int NColumns = 10; // for example
while( myFile )
{
    //  start a new line in the matrix
    for( int column = 0; column < NColumns; ++column )
    {
        if( column > 0 )
            myFile >> sep<','>; // read the separator
        int x;
        if( !( myFile >> x ) )
            break; // eof or read error
        // add 'x' to the current line in the matrix
    }
}

实用程序sep&lt;&gt;看起来像这样

template< char C >
std::istream& sep( std::istream& in )
{   // reads separator 'C'
    char c;
    if( in >> c && c != C )
        in.setstate( std::ios_base::failbit );
    return in;
}

答案 2 :(得分:0)

我更喜欢使用提升。与此相似的东西应该适合你。

vector<string> strSplits;
boost::split(strSplits, line, boost::is_any_of(",")  );