有效地读取csv文件的最后一行

Efficiently read the last row of a csv file

本文关键字:一行 最后 读取 csv 文件 有效地      更新时间:2023-10-16

是否有一种有效的C或c++方法来读取CSV文件的最后一行?幼稚的方法包括读入整个文件,然后到末尾。是否有更快的方法可以做到这一点(特别是如果CSV文件很大)?

您可以做的是猜测行长度,然后在文件结束前跳转2-3行并读取剩余的行。您读取的最后一行是最后一行,只要您至少提前读取一行(否则,您仍然以更大的偏移量重新开始)

我张贴了一些示例代码做类似的事情(阅读最后N行)在这个答案(在PHP中,但作为一个说明)

有关各种语言的实现,请参见

  • c++: c++最快的方式来读取最后一行文本文件?
  • Python:有效地查找文本文件
  • 中的最后一行
  • Perl:我如何从Perl文件的末尾读取行?
  • c#:获取最后10行非常大的文本文件> 10GB c#
  • PHP:如何读取文本文件的最后5行
  • Java:读取最后n行文件
  • Ruby:在Ruby中读取文件的最后n行?
  • 如何从NSFileHandle中逐行读取数据?

您可以尝试反向工作。从文件末尾读取一定大小的字节块,并查找换行符。如果该块中没有换行符,则读取前一个块,依此类推。

请注意,如果一行的大小相对于文件的大小很大,这可能会导致更差的性能,因为大多数文件缓存方案都假设有人在文件中向前读取。

可以使用Perl模块File::ReadBackwards

您的问题与在文件中搜索字符串属于同一领域。正如您正确指出的那样,将整个文件读入内存然后搜索字符串并不总是一个好主意。但你总可以做次优选择。内存映射你的文件。然后使用字符串搜索函数从字符串末尾向后搜索换行符

这是一种非常有效的机制,具有最小的内存占用和最佳的磁盘I/o。

用什么读什么上?在Unix系统上,如果需要最后一行,只需输入

即可。
tail -n1 file.csv

如果你想在你的c++应用程序中使用这种方法,你可以这样做

system("tail -n1 file.csv")