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