Perl - лучший способ создания сжатых файлов - PullRequest
3 голосов
/ 03 марта 2011

Мне нужно изменить свою рутину и сделать финальный выходной. Я пытаюсь выяснить, как лучше всего сжать обработанный файл в подпрограмме perl.

Например, у меня есть подпрограмма, которая создает файл (extract_data). Вот основной цикл и подпрограмма:

foreach my $tblist (@tblist)
{
   chomp $tblist;
   extract_data($dbh, $tblist);
};
$dbh->disconnect;

sub extract_data
{
     my($dbh, $tblist) = @_;
     my $final_file = "/home/proc/$node-$tblist.dat";
     open (my $out_fh, '>', $final_file) or die "cannot create $final_file: $!";
     my $sth = $dbh->prepare("...");
     $sth->execute();
     while (my($uid, $hostnm,$col1,$col2,$col3,$upd,$col5) = $sth->fetchrow_array() ) {
       print $out_fh "__my_key__^A$uid^Ehost^A$hostnm^Ecol1^A$col1^Ecol2^A$col2^Ecol3^A$col3^Ecol4^A$upd^Ecol5^A$col5^D";
     }
     $sth->finish;
     close $out_fh or die "Failed to close file: $!";
};

я делаю gzip в основном или с сабом? Каков наилучший способ сделать это? Тогда мой новый файл будет $final_file =/home/proc/$node-$tblist.dat.gz

спасибо.

Ответы [ 2 ]

10 голосов
/ 03 марта 2011

Я знаю, что есть модули для этого без использования внешних программ, но, поскольку я понимаю, как использовать gzip намного лучше, чем я понимаю, как использовать эти модули, я просто открываю процесс для gzip и вызываю его день.

open (my $gzip_fh, "| /bin/gzip -c > $final_file.gz") or die "error starting gzip $!";
...
while (... = $sth->fetchrow_array()) {
    print $gzip_fh "__my_key__^A$uid^Ehost^A$hostname..."; # uncompressed data
}
...
close $gzip_fh;
2 голосов
/ 07 марта 2014

Вы можете использовать IO :: Compress :: Gzip, который входит в набор основных модулей Perl:

use IO::Compress::Gzip qw(gzip $GzipError) ;

my $z = new IO::Compress::Gzip($fileName);
  or die "gzip failed: $GzipError\n";

# object interface
$z->print($string);
$z->printf($format, $string);
$z->write($string);
$z->close();

# IO::File mode
print($z $string);
printf($z $format, $string);
close($z);

Подробнее на perldoc

FWIW, есть также IO :: Uncompress :: Gunzip для чтения из сжатых файлов аналогичным образом.

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