当数据包含换行符时,Text :: CSV解析

时间:2013-08-28 10:46:05

标签: perl csv

我有一个解析csv文件的代码,数据也包含换行符。 但Text :: CSV在数据

中遇到“\ n”时会中断

这是解析代码

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"

1 个答案:

答案 0 :(得分:3)

您还需要将escape_char设置为\,因为它默认为"。但是,如果您运行pure-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中的错误。