【问题标题】:What is the fastest way to get the number of rows in a csv file?获取csv文件中行数的最快方法是什么?
【发布时间】:2018-04-29 10:06:53
【问题描述】:

获取 CSV 文件中的行数的最佳方法是什么?我有一个大的 CSV 文件(1 GB),并且使用 getline 遍历整个文件需要很长时间。 这是我尝试过的:

string s; 
int RowCount=0;

ifstream in("sample.csv");

while(!in.eof()) {
    getline(in, s);
    RowCount ++;
}

cout << "Rows: "<<RowCount;

in.close(); 

有没有办法在不打开文本文件的情况下确定它的行数?

【问题讨论】:

  • 有没有办法在不打开文本文件的情况下确定它的行数? 几乎没有;除非你有一些信息。例如:固定的行长度或某种标题/元数据。
  • 不,不打开文件就无法以任何方式检查文件的内容。
  • 尝试in.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 而不是std::getline
  • 我可以在这里感受到XY problem 的潜力。为什么首先需要行数?你不会分配一些固定大小的数组或任何东西,对吧?

标签: c++ csv file-handling


【解决方案1】:

如果不打开文件,您无法确定文件中的行数。除非每一行都是固定长度,在这种情况下,您可以简单地将文件大小除以一行的长度。否则,您实际上必须通读整个文件,计算行数。

这应该尽可能快:

std::ifstream in("sample.csv");

std::size_t RowCount = 0;

char buff[4096]; // larger = faster (within limits)

while(in.read(buff, sizeof(buff)) || in.gcount())
    RowCount += std::count(buff, buff + in.gcount(), '\n');

std::cout << "Rows: " << RowCount;

它将文件以块的形式读入缓冲区并计算行结束标记'\n'的数量。缓冲区越大,效率应该越高。

【讨论】:

  • 我找不到参考 atm,所以我可能只是疯了,但我相当肯定我在过去几年中遇到了一些更有效的行计数算法.. 仍然支持这一点。
  • @JesperJuhl 老实说,我真的看不出一个程序如何在不读取所有文件的情况下发现文件包含多少行结束标记。我能想象到提高速度的唯一方法是使用较低级别的系统特定调用,以消除任何潜在的中间缓冲。
  • 有道理。我只是有这个唠叨的记忆。不过,我可能只是把事情搞混了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2011-12-23
  • 1970-01-01
  • 2019-08-13
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多