2010-09-27 2 views
4

Привета,Run `head` в текстовой файл внутри архива архивного без распаковки архива

Я взят из предыдущей команды и написания заданий ETL, какие файлы процесса CSV. Я использую комбинацию скриптов оболочки и perl на ubuntu. Файлы csv огромны; они прибывают как архивы с застежкой-молнией. Unzipped, многие из них более 30Gb - да, это G

Legacy process - это пакетное задание, выполняемое на cron, которое полностью распаковывает каждый файл, считывает и копирует первую строку в файл конфигурации, затем повторно застегивает весь файл. В некоторые дни это занимает много часов обработки, без каких-либо преимуществ.

Можете ли вы предложить метод для извлечения первой строки (или первых нескольких строк) из каждого файла в архиве с застежкой-молнией без полной распаковки архивов?

+0

Я знаю, что это не ответ, но вера, по крайней мере, с помощью gzip-архивов, вы можете это сделать, даже просто vi прочитает в gzip. Для gzip это программы zcat и zgrep, я не знаю, работают ли они с обычной почтой. –

+0

Почему задание повторно застегивает файл? Почему он не может использовать оригинальный zip-файл? –

ответ

6

Утилита командной строки unzip имеет параметр -p, который выгружает файл в стандартную версию. Просто подключите его к head, и он не будет беспокоить извлечение всего файла на диск.

В качестве альтернативы, от perldoc IO::Compress::Zip:

my ($status, $bufferRef); 
my $member = $zip->memberNamed('xyz.txt'); 
$member->desiredCompressionMethod(COMPRESSION_STORED); 
$status = $member->rewindData(); 
die "error $status" unless $status == AZ_OK; 
while (! $member->readIsDone()) 
{ 
    ($bufferRef, $status) = $member->readChunk(); 
    die "error $status" if $status != AZ_OK && $status != AZ_STREAM_END; 
    # do something with $bufferRef: 
    print $$bufferRef; 
} 
$member->endRead(); 

Изменить в соответствие, т.е. итерации по списку файлов $zip->memberNames(), и только прочитав первые несколько строк.

+0

'unzip -p filename.zip | head -1 >> headers.txt' работает БЕСПЛАТНО спасибо вам большое – iconridge

1

Python's zipfile.ZipFile позволяет получить доступ к архивированным файлам в виде потоков через ZipFile.open(). Оттуда вы можете обработать их по мере необходимости.

Смежные вопросы