TCL:从文件中读取只包含相关单词的行
我正在读取文件并对数据进行一些操作。 很遗憾,我收到以下错误消息: 无法分配347392字节 流产 由于文件很大,我只想读取包含一些单词的行(在“regexp_或”中描述) 有没有办法只读取包含“regexp_或”的行并保存foreach循环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
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%。我为每种方法运行了几次测试,并比较了每种方法的最短时间。