是否有一种有效的 C 或 C++ 方法来读取 CSV 文件的最后一行?天真的方法涉及读取整个文件,然后走到最后。有没有更快的方法可以做到这一点(特别是如果 CSV 文件很大)?
问问题
3696 次
5 回答
4
你可以做的是猜测行长,然后在文件末尾前跳2-3行并读取剩余的行。您阅读的最后一行是最后一行,只要您之前至少阅读了一行(否则,您仍然会以更大的偏移量重新开始)
我在这个答案中发布了一些用于做类似事情的示例代码(阅读最后 N 行)(在 PHP 中,但用作说明)
有关各种语言的实现,请参阅
- C++:C++ 最快的方式来读取文本文件的最后一行?
- Python:有效地查找文本文件中的最后一行
- Perl:如何在 Perl 中从文件末尾读取行?
- C#:获取最后 10 行非常大的文本文件 > 10GB c#
- PHP:如何只读取 txt 文件的最后 5 行
- Java:读取一个巨大文件的最后 n 行
- Ruby:在 Ruby中读取文件的最后 n 行?
- Objective-C:如何逐行从 NSFileHandle 读取数据?
于 2013-05-26T18:35:40.387 回答
1
您可以尝试向后工作。从文件末尾读取一些大小的字节块,然后查找换行符。如果该块中没有换行符,则读取前一个块,依此类推。
请注意,如果行的大小相对于文件的大小很大,这可能会导致性能下降,因为大多数文件缓存方案都假设有人在文件中向前读取。
于 2013-05-26T18:36:43.570 回答
0
您可以使用 Perl 模块File::ReadBackwards。
于 2013-05-26T18:38:08.590 回答
0
读什么,读什么?在 Unix 系统上,如果你想要最后一行,它很简单
tail -n1 file.csv
如果您希望在您的 C++ 应用程序中使用这种方法,您可以执行类似的操作
系统(“尾 -n1 文件.csv”)
如果您想要一种快速而肮脏的方式来完成此任务。
于 2013-05-26T18:39:41.897 回答
0
您的问题与在文件中搜索字符串属于同一域。正如您正确指出的那样,将整个文件读入内存然后搜索您的字符串并不总是一个好主意。但是你总是可以做次好的事情。内存映射您的文件。然后使用您的字符串搜索功能从字符串末尾向后搜索换行符。
这是一种极其有效的机制,具有最小的内存占用和最佳的磁盘 I/O。
于 2013-05-26T18:47:53.800 回答