我有一个解析 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"
您还需要设置escape_char
to \
,因为它默认为"
。但是,如果您运行纯 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 中的错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)