高效读取csv文件的最后一行

3

有没有一种高效的C或C ++方法来读取CSV文件的最后一行?天真的方法涉及读入整个文件,然后到达末尾。是否有更快的方法可以完成此操作(特别是如果CSV文件很大)?


1
你只添加了 "C ++"。那 C 标签呢?毕竟,你说过 "C/C++",而这两种语言对于读取文件有不同的函数,例如 C 中是 fgets,C++ 中是 std::getline - Thomas Matthews
5个回答

4
你可以猜测行长度,然后在文件末尾前跳过2-3行并读取剩余的行。你读取的最后一行是最后一行,只要你至少读取了一行(否则,你仍然需要用更大的偏移量重新开始)。
我在这个答案中发布了一些样例代码,用于执行类似的操作(读取最后N行)(使用PHP编写,但可作为说明)。
有关各种语言的实现,请参见:

1
该死!但感谢你发现了这个问题...我会找到更好的例子! - Paul Dixon

1
你可以尝试倒序工作。从文件末尾读取一些大小块的字节,并查找换行符。如果该块中没有换行符,则读取前一个块,以此类推。
请注意,如果一行的大小相对于文件的大小较大,则可能会导致性能变差,因为大多数文件缓存方案假定某人按文件正向阅读。

一个问题是可能需要备份两行或更多的文本。因此,文件必须被读取直到最后一行文本导致EOF。不能假设下一行文本是文件的最后一行。 :-) - Thomas Matthews

0

很遗憾,我需要一个 C++ 的解决方案。 - user788171
1
好的,看看它做了什么,然后在C++中重新实现它 - 这并不难。 - mvp

0

用什么和在什么上读取?在Unix系统上,如果你想要最后一行,那就很简单了。

tail -n1 file.csv

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

system("tail -n1 file.csv")

如果你想要一种快速而简单的方法来完成这个任务。

是的,这是正确的,不幸的是有些白痴编辑了我的问题并删除了C/C++。我正在寻找一个C/C++的解决方案。 - user788171
好像有人把它放回去了。我会编辑我的答案来适应。 - Dmitri

0

你的问题与在文件中搜索字符串的领域相同。正如你所指出的那样,将整个文件读入内存然后搜索字符串并不总是一个好主意。但你可以做下一个最好的事情。将文件映射到内存中。然后使用字符串搜索函数从字符串末尾向后搜索换行符。

这是一种极其高效的机制,具有最小的内存占用和最佳的磁盘I/O。


你能提供更多关于如何映射所讨论文件的信息吗?这是一种我从未听说过的新方法,所以我很想了解更多细节。 - user788171
1
使用内存映射文件时,与将文件读入内存(分段)相同,只是运行时库或操作系统在执行此操作。 - Thomas Matthews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接