2013-08-28 25 views
3

我有一個解析csv文件的代碼,數據也包含換行符。 但文字:: CSV打破,當它遇到「\ n」裏面的數據當數據包含換行符時,文本:: CSV分析

這是解析代碼

use Data::Dumper; 
use Text::CSV; 
my $csv = Text::CSV->new ({ binary=> 1, eol => $/, allow_loose_quotes => 1, allow_loose_escapes=> 1 }) || die $!; 
#print Dumper($csv);                               

my $file = $ARGV[0]; 
open my $csv_handle, $file or die $!; 
while (my $row = $csv->getline($csv_handle)) { 
    print Dumper($row); 
} 

這是數據

196766,31,"MR SRINIVASALU LAKSHMIPATHY\"DEC\"\ 
\"71" 
196766,56,"255233.47" 
+0

數據是否需要包含換行符?你能不能只是/ \ n //;'? –

+0

幾乎...嘗試'\\\\ n // sg;' –

+0

不,我不想丟失數據中的換行符 – Ram

回答

2

您還需要設置escape_char\,因爲它默認爲"。但是,如果運行純perl版本的Text::CSV,則這不能解決問題。隨着XS版本(Text::CSV_XS),這個工程:

use strict; use warnings; 
use Text::CSV; 
use Data::Dumper; 

my $csv = Text::CSV->new({ 
    binary => 1, 
    eol => "\n", 
    quote_char => '"', 
    escape_char => '\\', 
    auto_diag => 2, 
    allow_loose_escapes => 1, 
}) or die "Can't create CSV parser"; 

while(my $row = $csv->getline(\*DATA)) { 
    print Dumper $row; 
} 

__DATA__ 
1,"2 
",3 
196766,31,"MR SRINIVASALU LAKSHMIPATHY\"DEC\"\ 
\"71" 
196766,56,"255233.47" 

的純Perl語法分析器失敗二號記錄和報告缺少右引號。如果我們將allow_loose_quotes設置爲真值,則CSV將解析,但第二條記錄將被拆分(插入包含\"71"的唯一字段的第三條記錄)。 XS版本不顯示此行爲。

這看起來像Text :: CSV_PP中的一個錯誤。

相關問題