2012-03-17 4 views
1

Perlで約5 MBのCSVファイルを圧縮しようとしました。以下は私の郵便番号です。 ファイルは圧縮されていますが、Windowsのunzipユーティリティでファイルを開くと、CSVファイルの最後の行が見つからないことがわかりました。何が問題なの?私はchuncksizedesiredCompressionLevelを変更しようとしましたが、これは役に立たなかった。perlでファイルを圧縮すると、最後の行が切り捨てられます

sub zip_util{ 
    my $directory = shift; 
    $zip = Archive::Zip->new(); 
    $zip->setChunkSize(65536); 
    # Add a file from disk 

    my $file1=File::Spec->catfile($directory, 'file.csv'); 
    my $file2=File::Spec->catfile($directory, 'file2.csv'); 
    my $file3=File::Spec->catfile($directory, 'fil3.csv'); 
    $zip->addFile($file1,'file1.csv')->desiredCompressionLevel(6); 
    $zip->addFile($file2,'file2.csv')->desiredCompressionLevel(6); 
    $zip->addFile($fil3,'file3.csv')->desiredCompressionLevel(6); 

    # Save the Zip file 
    my $zipped_file=File::Spec->catfile($directory,'files.zip'); 
    unless ($zip->writeToFileNamed($zipped_file) == AZ_OK) { 
     print LOG ": Zip Creation error\n"; 
    } 
+1

[Archive :: Zip'](https://metacpan.org/module/Archive::Zip)に問題がある可能性があります。ただし、元のCSVファイルと生成されたアーカイブをアップロードしてください。 –

答えて

1

私はそれを警告と狭義でチェックしましたが、特定の問題が見つかりました。

  1. $zipは(それは意図的だ場合、私は知らないが、use strictは本当にこのようにグローバルに役立ちます)my使用していません。
  2. 実行中です$zip->addFile($fil3,'file3.csv')です。 $fil3変数が存在しません。何でもあれば、この変数は$file3です。
  3. コピー&ペースト中に問題があると思われますが、サブルーチンには中括弧がありません。

私はテスト中に使用したクイックスクリプトを実行しました。

use strict; 
use warnings; 
use Archive::Zip qw(:ERROR_CODES); 
use File::Spec; 

sub zip_util { 
    my ($directory) = @_; 
    my $zip = Archive::Zip->new(); 
    $zip->setChunkSize(65536); 

    # Add a file from disk 
    my $file1 = File::Spec->catfile($directory, 'file.csv'); 
    my $file2 = File::Spec->catfile($directory, 'file2.csv'); 
    my $file3 = File::Spec->catfile($directory, 'file3.csv'); 
    $zip->addFile($file1, 'file1.csv')->desiredCompressionLevel(6); 
    $zip->addFile($file2, 'file2.csv')->desiredCompressionLevel(6); 
    $zip->addFile($file3, 'file3.csv')->desiredCompressionLevel(6); 

    # Save the Zip file 
    my $zipped_file = File::Spec->catfile($directory, 'files.zip'); 
    if ($zip->writeToFileNamed($zipped_file) != AZ_OK) { 
     print STDERR "Zip Creation error\n"; 
    } 
} 

zip_util '.'; 

問題は機能していたことです。だから、私は5メガバイトのファイルのいくつかの並べ替えをするために、このスクリプトをやった:

use strict; 
use warnings; 
use 5.010; 

for (1 .. 524_288) { 
    my $number = $_ % 10; 
    say "$number-------"; 
} 

どちらZIP内のファイルとオリジナルの「CSV」は、これと同じ大きさと内容を持っていました。だから、これは恐らく私が言及した2番目の問題です - $fil3変数や何かをあなたのファイルに使用しています(あなたは悲しげにアップロードされていないので、それらを調べることはできません)。

関連する問題