高效读取带有可选列的 CSV 文件

Efficiently read CSV file with optional columns

本文关键字:CSV 文件 读取 高效      更新时间:2023-10-16

我正在尝试编写一个在 CSV 文件中读取的程序(无需担心转义任何东西,它的格式严格,没有引号),但任何值为 0 的数字项都留空。因此,正常行如下所示:

12,字符串1,字符串2,3,,,字符串3,4.5

而不是

12,字符串1,字符串2,3,0,

0,字符串3,4.5

我有一些使用向量的工作代码,但它太慢了。

int main(int argc, char** argv)
{
    string filename("path\to\file.csv");
    string outname("path\to\outfile.csv");
    ifstream infile(filename.c_str());
    if(!infile) 
    {
      cerr << "Couldn't open file " << filename.c_str();
      return 1;
    }
    vector<vector<string>> records;
    string line;
    while( getline(infile, line) )
    {
        vector<string> row;
        string item;
        istringstream ss(line);
        while(getline(ss, item, ','))
        {
            row.push_back(item);
        }
        records.push_back(row);
    }
    return 0;
}

是否可以重载运算符<<的 ostream 类似于 如何使用C++读取.csv文件并以另一种形式输出? 何时字段可以为空?这会提高性能吗?

或者我还能做些什么来让它运行得更快吗?谢谢

从文件中读取字符串数据所花费的时间大于解析它所花费的时间。 在分析字符串时,您不会节省大量时间。

为了使程序运行得更快,请将更大的"块"读入内存;每次读取获得更多数据。 内存映射文件的研究。

处理此问题以获得更好性能的一种替代方法是将整个文件读入缓冲区。然后遍历缓冲区并设置指向值开始位置的指针,如果发现 或行尾放入 \0。

例如 https://code.google.com/p/csv-routine/