如何使用c ++在CSV文件上执行逐行操作(某些x)

时间:2015-12-20 17:43:57

标签: c++ sqlite csv c++11 getline

我一直在努力处理整条线路(\ n或\ r),我自己被分配了一个任务来读取包含4K线路的.csv文件。凭借我的好奇心,我找到了阅读方式csv文件并将每个字段/单词与分隔符','分开。

std::istream& safeGetline(std::istream& is, std::string& t)
{
    t.clear();
    std::istream::sentry se(is);
    std::streambuf* sb = is.rdbuf();

    for(;;) {
        int c = sb->sbumpc();
        switch (c) {
        case '\r':
            if(sb->sgetc() == '\n')
                sb->sbumpc();
            return is;
        case EOF:
            // Also handle the case when the last line has no line ending
            if(t.empty())
                is.setstate(std::ios::eofbit);
            return is;
        default:
            t += (char)c;
        }
    }
}

    int main()
    {
        cout<<"Enter the file path :";
        string filename;
        cin>>filename;
        ifstream file;
        file.open(filename.c_str(),ios::in);
        vector<string>arr;
        string content;
        string arr2;
        stringstream ss;
       // sqlite3 *db;int rc;sqlite3_stmt * stmt;
        int i=0;
         while (!safeGetline(file,content).eof())--here is the problem
        {
            ss<<content;
    //since some of the field content falls next line i have decided to remove the '\n'
            content.erase(std::remove(content.begin(), content.end(), '\n'), content.end());
            while (getline(ss,arr2,','))
            {
               arr.push_back(arr2);
            }
       }
}

这里while (!safeGetline(file,content).eof()) - 我认为这段代码会读取CSV文件中的第一行并通过while (getline(ss,arr2,','))进行分隔符分隔,但是发生了什么safeGetline()正常getline() - 我之前尝试过而不是safeGetline()读取整个内容并通过分隔符分隔部分这使我很难在数据库中插入这些字段

例如:

4xxxxxx,"field2",field3,,,,field7
400x1x2,"field2",,field4,,,field7

代码开始读取后,while(!safeGetline(文件,内容).eof())返回

输出:

4 xxxxxx,"field2",field3,,,,field7400x1x2,"field2",,field4,,,field7

这里field7和第二行出现的值400x1x2合并field7400x1x2 - 当我将这些字段插入到我的表中时,这会给出伪造的结果(即)值在表内不正确地混乱。 / p>

那么我怎样才能真正执行逐行读取操作(即)在我的情况下读取&gt;单独的分隔符 - &gt;推送到矢量 - &gt;插入到表格 - &gt;第二次读取 - &gt; ....

1 个答案:

答案 0 :(得分:1)

您的切换声明

    switch (c) {
    case '\r':
        if(sb->sgetc() == '\n')
            sb->sbumpc();
        return is;
    case EOF:
        // Also handle the case when the last line has no line ending
        if(t.empty())
            is.setstate(std::ios::eofbit);
        return is;
    default:
        t += (char)c;
    }

只检测&#39; \ r&#39;或者&#39; \ r \ n&#39;案件。它无法使用&#39; \ n&#39;来处理文件。个性。

所以改变它:

    case '\n':
    case '\r':
        if(sb->sgetc() == '\n' || sb->sgetc() == '\r')
            sb->sbumpc();
        return is;