Как я могу распаковать и распечатать последние несколько строк сжатого текстового файла?

Хорошо, поэтому - взять какой-то ввод, разделить его на 5 , а затем разбить фрагменты на отдельные файлы?

На самом деле добавить «лишнее» в последний файл немного сложнее, чем кажется, так как вам нужно прочитать все сначала , прежде чем вы сможете узнать распределение, но довольно легко выполнить циклический перебор вывода :

  • Открыть 4 дескриптора файла
  • установить разделитель записей на 5 .
  • перебирают входные записи, выбирая дескриптор файла на основе номера «блока» $.
  • print to that fh

Что-то вроде:

#!/usr/bin/env perl
use strict;
use warnings;

my $num_files_to_write = 4;
use Data::Dumper;

my @filehandles; 
for my $id ( 1..$num_files_to_write ) {
   open ( my $fh, '>', "file_$id.txt" ) or die $!;
   push @filehandles, $fh; 
}

local $/ = '5';
while ( <> ) {
    select $filehandles[$. % $num_files_to_write];
    print; 
}

foreach my $fh ( @filehandles ) { 
   close ( $fh ); 
}

Примечание - не совсем то, что вы хотели, потому что «первый» блок равен нулю, но ваш первый номер файла равен 1. Это так же просто, как добавить / вычитая из $. + 1%, например, $ num_files_to_write . Но это зависит от того, заботитесь ли вы, какой именно файл что получит, или это просто вопрос разделения.

5
28.06.2016, 13:17
1 ответ

Вы не можете, как уже было сказано , если файлы были сжаты стандартным gzip ]. Если у вас есть контроль над сжатием, вы можете использовать dictzip для сжатия файлов, он сжимает файлы в отдельных блоках, и вы можете распаковать только последний блок (обычно 64 КБ). И он обратно совместим с gzip , что означает, что файл, сжатый в формате dictzip, также является совершенно легальным файлом в формате gzip.

Другая возможность: если вы получите gzip-файл как объединение нескольких уже сжатых gzip-файлов, вы сможете найти последнюю подпись gzip и распаковать все после этого.

7
27.01.2020, 20:35

Теги

Похожие вопросы