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

How to read line by line gz file TCL/LINUX

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

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

我通过 google 搜索发现的唯一一件事是如何使用 gzcat 进行搜索,但它也不起作用 + 它不好,因为它会读取整个文件(我认为?)而且我不知道'希望它处理整个文件。

简而言之:我需要逐行读取一个 gz 文件,我该怎么做? 我平时做的事的例子:

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

我尝试过但不能做到的 understand\make 它对我有用:

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 选项将其发送到标准输出以便我们可以从管道中读取它。)