首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用TCL是否可以“向后”读取文件?

使用TCL是否可以“向后”读取文件?
EN

Stack Overflow用户
提问于 2014-02-05 08:36:31
回答 5查看 2.3K关注 0票数 1

我有一个非常大的文本文件,我必须从中提取一些数据。我逐行读取文件并查找关键字。因为我知道我正在寻找的关键字更接近文件的末尾而不是开始,所以我想知道是否有可能从最后一行而不是第一行开始读取文件。然后,我会用一个关键词表示“这个词以外的所有东西都不是干扰词”,然后停止阅读。

这有可能吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-02-05 09:26:52

不,这是不可能的(在我知道的任何运行时/语言中,包括Tcl )。

因此,请选择缓冲区一侧,并通过向后查找并尝试每次读取完整的缓冲区来读取您的文件。

请注意,您必须观察某些可能性:

  • 该文件可能小于缓冲区的大小。
  • 看起来,您正在处理一个文本文件,并且希望按行处理它。如果是这样的话,请注意,如果代码是跨平台的,或者必须在Windows上工作,则必须处理这样的情况:上次读取操作前放置在缓冲区中的数据以LF开头,下一个读取操作(前一个块的读取操作)将以CR结束,也就是说,您的EOL标记将被分割到缓冲区中。 您可能想看看Tcl_GetsObj()generic/tclIO.c文件中的实现,Tcl源代码-it在正常(“向前”)从文件中读取文本字符串时处理拆分CRLF。
票数 3
EN

Stack Overflow用户

发布于 2014-02-05 11:16:27

我不知道这会有多大的性能,但是通过tac运行该文件并从中读取:

代码语言:javascript
复制
set fh [open "|tac filename"]
# read from last line to first
while {[gets $fh line] != -1} {...

另一种策略是读取文件的最后5000个字节(使用seek),在换行符上拆分并检查这些行,然后从末尾查找10000,然后读取“下一个”5000字节,等等。

票数 4
EN

Stack Overflow用户

发布于 2014-02-05 14:38:52

如果您不知道记录的大小(即行长),抓取文件的末尾以便进行搜索,最简单的方法是抓取过多的内容并进行处理。

代码语言:javascript
复制
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进行搜索。(请注意,您将不知道匹配行在文件中的确切位置;如果需要,您必须做更多的工作。)

代码语言:javascript
复制
if {[lsearch -glob $lines "*FooBar*"] >= 0} {
    ...
}

删除读部分的第一行是因为您可能正在开始读到一行的一半;删除第一行将意味着您只有真正的行需要处理。(对于任何现代计算机系统来说,100 it并不是很好的搜索对象,但您可能会进一步限制它。这取决于数据的细节。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21572207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档