Запустите `head` для текстового файла в архиве без распаковки - PullRequest
4 голосов
/ 28 сентября 2010

Привет,

Я перенял у предыдущей команды и пишу задания ETL, которые обрабатывают CSV-файлы. Я использую комбинацию сценариев оболочки и Perl на Ubuntu. Файлы CSV огромны; они приходят в виде архивов. Разархивированный, многие более 30 Гб - да, это G

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

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

Ответы [ 2 ]

6 голосов
/ 28 сентября 2010

Утилита командной строки 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() и читая только первые несколько строк.

1 голос
/ 28 сентября 2010

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

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