我在TCL中制作了一个脚本,该脚本接收巨大的输入文件,逐行读取然后以某种方式修改数据。
当我需要对包含数据文件的* .gz格式文件执行相同操作时,问题就开始了。
我在Google搜索中发现的唯一一件事是如何使用gzcat进行操作,而且也没有用+不好,因为它读取了整个文件(我认为是),并且我不希望它处理整个文件。
简而言之:我需要逐行读取gz文件,我该怎么做? 我在正常情况下所做的示例:
trait
我尝试过并无法理解的方式\使其对我有用:
set fh [open <some path> r]
while {[gets $fh line]>=0} {
do something with $line
}
谢谢!
答案 0 :(得分:2)
如果您拥有Tcl 8.6,请执行以下操作:
set fh [open <SomePath.gz> r]
zlib push gunzip $fh
while {[gets $fh line]>=0} {
do something with $line
}
close $fh
在8.5或更低版本中,通过外部gzcat
进程是最简单的方法。
set ZCAT_PROGRAM gzcat; # Might be called something else on your system
set fh [open |[list $ZCAT_PROGRAM <SomePath.gz>] r]
while {[gets $fh line]>=0} {
do something with $line
}
close $fh
如果传递正确的标志,如果您有gzip
,也可以执行此操作,这具有以下优点:当它完全存在时,它被称为gzip
:
set fh [open |[list gzip -d -c <SomePath.gz>] r]
while {[gets $fh line]>=0} {
do something with $line
}
close $fh
(-d
选项会进行解压缩,-c
选项会将其发送到stdout,以便我们可以从管道中读取它。)