2012-03-17 34 views
1

我試圖壓縮一些CSV文件,這是約5 MB用Perl。以下是我的郵政編碼。 該文件是壓縮,但是當我使用Windows解壓縮工具中打開這些我發現,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

這可能與['存檔:: Zip'(https://metacpan.org/module/Archive::Zip)的問題。但是,爲了確保,您能否上傳原始CSV文件以及生成的存檔? – 2012-03-17 21:21:11

回答

1

我已經檢查了警告和限制,我發現了一些問題。

  1. $zip不使用my(我不知道這是否是故意的,但use strict真正與全局幫助像這樣的)。
  2. 您正在運行$zip->addFile($fil3,'file3.csv')。變量絕對不存在。如果有的話,這個變量是$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 '.'; 

問題是它正在工作。所以,我做了這個腳本,以某種5MB文件:

use strict; 
use warnings; 
use 5.010; 

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

在ZIP和原來的「CSV」這兩個文件有同樣大小和內容。所以,這可能是我提到的第二個問題 - 在您的文件中使用$fil3變量或其他東西(您可能沒有上傳,因此我無法查看這些內容)。