Я пытаюсь распаковать содержимое переменной в ту же переменную или в другую. Я создал файл .gz, используя имя файла gzip -k. Он сгенерировал имя файла.gz, сохранив оригинал. Я загрузил этот gz-файл на сервер. Следующая строка загружает файл gz в файл var. Да, я мог бы использовать пакет, требующий http и т. д.
set testvar [exec wget -q -O - url-to-gz-file]; string length $testvar
Длина строки $testvar возвращает число. Теперь мне нужно выкачать/распаковать то, что находится внутри $testvar, в ту же переменную или в другую переменную, например testvar2, и эта переменная должна содержать содержимое исходного файла. Я имею в виду содержимое файла до сжатия. Исходный файл представляет собой просто текстовый файл.
Вероятно, мне нужно указать, что testvar является двоичным.
Это возможно? Я не хочу сначала загружать файл .gz на жесткий диск, а потом обрабатывать его. Это все нужно делать «по памяти».
Спасибо.
Самый простой способ — просто передать wget
в gunzip
:
set result [exec wget -q -O - url-to-gz-file | gunzip -c]
Для этого необходимо, чтобы несжатое содержимое было закодировано в кодировке символов вашей системы по умолчанию; если это двоичные данные или какая-либо другая текстовая кодировка, у вас возникнут проблемы (Ваша переменная teststr
, вероятно, не содержит действительных данных gzip из-за перевода кодировки символов).
В таких случаях tcl поставляется с командой zlib для работы со сжатием zlib и gzip. В частности, здесь будет полезна подкоманда zlib gunzip STRING
. Для этого вам нужно использовать open, а не exec
, чтобы получить двоичные данные, которые можно передать в zlib gunzip
. Это будет выглядеть примерно так:
# b for opening in binary mode instead of having to set it with fconfigure
set wget [open "| wget -q -O - url-to-gz-file" rb]
set binData [zlib gunzip [read -nonewline $wget]]
close $wget
set result [encoding convertfrom utf-8 $binData] ;# Or whatever encoding the file uses
Вы можете использовать zlib push
, чтобы добавить слой в канал wget
, чтобы использование read
на нем также автоматически распаковывало данные.
set wget [open "| wget -q -O - url-to-gz-file" rb]
zlib push gunzip $wget
set result [encoding convertfrom utf-8 [read -nonewline $wget]]
close $wget
Преобразования канала действуют на стороне двоичных данных канала. Вероятно, вам не понадобится encoding convertfrom
при использовании zlib push gunzip
.
@DonalFellows Я тестировал это; это было необходимо.
Если подумать, интересно, сделал бы fconfigure -encoding
это.
Вы также можете совместить открытие конвейера с настройкой кодировки текста. Есть более одного способа сделать это не только для Perl.