使用perl压缩文件,最后一行被切断

时间:2012-03-17 20:43:39

标签: perl compression zip

我尝试使用Perl压缩一些大约5 MB的CSV文件。以下是我的邮政编码。 这些文件是压缩的,但当我使用Windows解压缩实用程序打开它时,我发现CSV文件的最后几行丢失了。这可能是什么问题?我尝试更改chuncksizedesiredCompressionLevel,但这没有帮助。

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 个答案:

答案 0 :(得分:1)

我已经用警告和限制检查了它,我发现了一些问题。

  1. $zip不使用my(我不知道它是否有意,但use strict确实有助于像这样的全局变量。)
  2. 您正在运行$zip->addFile($fil3,'file3.csv')$fil3变量肯定不存在。如果有的话,这个变量是$file3
  3. 我想这是复制和粘贴过程中的问题,但是子程序没有匹配的括号。
  4. 我已经完成了我在测试过程中使用的快速脚本。

    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 '.';
    

    问题在于它正在发挥作用。所以,我已经完成了这个脚本来制作一些5MB的文件:

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

    ZIP和原始“CSV”中的文件都具有相同的大小和内容。所以,这可能是我提到的第二个问题 - 使用$fil3变量或者你的文件(你很遗憾没有上传,所以我无法查看这些)。