【问题标题】:Text::CSV parsing when data contains newline数据包含换行时的 Text::CSV 解析
【发布时间】:2013-08-31 09:36:34
【问题描述】:

我有一个解析 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"

【问题讨论】:

  • 数据是否需要包含换行符?你能s/\n//;吗?
  • 差不多...试试s/\\\n//sg;
  • 不,我不想丢失数据中的换行符
  • 在这里为我工作。您可能需要指定您所在的平台、Text::CSV 的版本以及它是纯perl 版本还是XS 版本。哦,文件的行尾是否与您的 perl 操作系统相同。

标签: perl csv


【解决方案1】:

您还需要将escape_char 设置为\,因为它默认为"。但是,如果您运行 Text::CSV 的纯 perl 版本,这并不能解决问题。使用 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 中的一个错误。

【讨论】:

    猜你喜欢
    • 2011-03-17
    • 2014-08-18
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多