TCL:从文件中读取只包含相关单词的行

TCL:从文件中读取只包含相关单词的行,tcl,Tcl,我正在读取文件并对数据进行一些操作。 很遗憾,我收到以下错误消息: 无法分配347392字节 流产 由于文件很大,我只想读取包含一些单词的行(在“regexp_或”中描述) 有没有办法只读取包含“regexp_或”的行并保存foreach循环 set regexp_or "^Err|warning|Fatal error" set file [open [lindex $argv 1] r] set data [ read $file ] foreach l

我正在读取文件并对数据进行一些操作。 很遗憾,我收到以下错误消息:

无法分配347392字节 流产

由于文件很大,我只想读取包含一些单词的行(在“regexp_或”中描述)

有没有办法只读取包含“regexp_或”的行并保存foreach循环

set regexp_or "^Err|warning|Fatal error"
    set file [open [lindex $argv 1] r]
    set data [ read $file ]

foreach line [ split $data "\n" ] {
    if {[regexp [subst $regexp_or] $line]} {
         puts $line
    }
}

您可以通过
grep
提取您的输入:

set file [open |[list grep -E $regexp_or [lindex $argv 1]] r]
但这取决于
grep
是否可用。要在Tcl中完全实现这一点,您可以分块处理文件:

set file [open [lindex $argv 1] r]
while {![eof $file]} {
    # Read a million characters
    set data [read $file 1000000]
    # Make sure to only work with complete lines
    append data [gets $file]

    foreach line [lsearch -inline -all -regexp [split $data \n] $regexp_or] {
        puts $line
    }
}
close $file

当然,您也可以使用
gets
逐行处理文件,但这可能要慢得多(注意:我没有实际测量)。我不希望它会慢得多,因为缓冲做得很好,但我从未测试过。我也没有一个合适的输入语料库来做这样的测试…我只是在一个30MB的文件上做了一个快速测试,计算匹配项(有3645个)。分块的方法大约快了12%。我为每种方法运行了几次测试,并比较了每种方法的最短时间。