我有一个非常大的文本文件,我必须从中提取一些数据。我逐行读取文件并查找关键字。因为我知道我正在寻找的关键字更接近文件的末尾而不是开始,所以我想知道是否有可能从最后一行而不是第一行开始读取文件。然后,我会用一个关键词表示“这个词以外的所有东西都不是干扰词”,然后停止阅读。
这有可能吗?
发布于 2014-02-05 09:26:52
不,这是不可能的(在我知道的任何运行时/语言中,包括Tcl )。
因此,请选择缓冲区一侧,并通过向后查找并尝试每次读取完整的缓冲区来读取您的文件。
请注意,您必须观察某些可能性:
Tcl_GetsObj()在generic/tclIO.c文件中的实现,Tcl源代码-it在正常(“向前”)从文件中读取文本字符串时处理拆分CRLF。发布于 2014-02-05 11:16:27
我不知道这会有多大的性能,但是通过tac运行该文件并从中读取:
set fh [open "|tac filename"]
# read from last line to first
while {[gets $fh line] != -1} {...另一种策略是读取文件的最后5000个字节(使用seek),在换行符上拆分并检查这些行,然后从末尾查找10000,然后读取“下一个”5000字节,等等。
发布于 2014-02-05 14:38:52
如果您不知道记录的大小(即行长),抓取文件的末尾以便进行搜索,最简单的方法是抓取过多的内容并进行处理。
set f [open $filename]
# Pick some large value; the more you read, the slower
seek $f -100000 end
# Read to the end, split into lines and *DISCARD FIRST*
set lines [lrange [split [read $f] "\n"] 1 end]现在您可以使用lsearch进行搜索。(请注意,您将不知道匹配行在文件中的确切位置;如果需要,您必须做更多的工作。)
if {[lsearch -glob $lines "*FooBar*"] >= 0} {
...
}删除读部分的第一行是因为您可能正在开始读到一行的一半;删除第一行将意味着您只有真正的行需要处理。(对于任何现代计算机系统来说,100 it并不是很好的搜索对象,但您可能会进一步限制它。这取决于数据的细节。)
https://stackoverflow.com/questions/21572207
复制相似问题