2011-03-02 4 views
3

J'ai besoin de modifier ma routine et de faire gzipper le fichier final. J'essaie de comprendre quelle est la meilleure façon de gzip un fichier traité appelé dans un sous-programme Perl.perl - la meilleure façon de créer des fichiers gzippés

Par exemple, j'ai une sous-routine qui crée le fichier (extract_data). Voici la boucle principale et au sous-programme

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: $!"; 
}; 

Est-ce que je fais gzip dans le principal ou le sous? Quelle est la meilleure façon de le faire? Ensuite, mon nouveau fichier serait $final_file =/home/proc/$node-$tblist.dat.gz

merci.

Répondre

10

Je sais qu'il existe des modules pour faire cela sans utiliser de programmes externes, mais comme je comprends comment utiliser gzip mieux que je comprends comment utiliser ces modules, je viens d'ouvrir un processus à gzip et de l'appeler un jour.

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; 
+1

il ne devient pas beaucoup plus facile que cela –

+0

dans mon cas, ce qui serait '@ some_uncompressed_data'? Serait-ce 'print $ gzip @ final_file'? – jdamae

+0

@jdamae - c'est ce que vous envoyez actuellement à '$ out_fh'. Vous pouvez appeler 'print $ gzip_fh ...' plusieurs fois si vous le souhaitez, comme vous le faites maintenant. – mob

2

Vous pouvez utiliser IO :: Compress :: Gzip, qui est dans l'ensemble des principaux modules 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); 

Plus de détails à perldoc

FWIW, il y a aussi IO::Uncompress::Gunzip pour la lecture à partir de fichiers gzippés d'une manière similaire.

Questions connexes