如何逐行读取gz文件TCL/LINUX



我在TCL中制作了一个脚本,它接收巨大的输入文件,逐行读取,然后以某种方式修改数据。

当我需要对包含数据文件的*.gz格式文件执行同样的操作时,问题就开始了。

我在谷歌搜索中发现的唯一一件事是如何使用gzcat,这也不起作用+这不好,因为它读取了整个文件(我认为是?(,我不希望它处理整个文件。

简而言之:我需要逐行读取gz文件,我该怎么做?我在正常情况下所做的示例:

set fh [open <some path> r]
while {[gets $fh line]>=0} {
do something with $line
}

我尝试过但无法理解的东西让它对我有用:

set pipeline [open "| zcat foo.gz"]
set data [read $pipeline]
close $pipeline

谢谢!

如果您有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,以便我们可以从管道中读取。(

最新更新