Как читать построчно gz файл TCL / LINUX - PullRequest
0 голосов
/ 22 ноября 2018

Я создал скрипт в TCL, который получает огромный входной файл, читает построчно, а затем каким-то образом изменяет данные.

проблема начинается, когда мне нужно сделать то же самое с файлами формата * .gz, которые содержат файл данных.

единственное, что я нашел в поиске Google, это как сделать это с помощью 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

спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Если у вас 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 отправляет ее на стандартный вывод, чтобы мы могли прочитать ее из конвейера.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...