perl - Text::CSV 在数据包含换行符时解析

标签 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"

最佳答案

您还需要将 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 中的错误。

关于perl - Text::CSV 在数据包含换行符时解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18485762/

相关文章:

postgresql - Postgres 中未终止的 CSV 引用字段

linux - 从 .csv 文件读取值并使用 Shell 脚本执行计算

perl - 在perl脚本中拼接

perl - 我无法理解以下 Perl 代码

perl - 检查散列键是否存在创建键

postgresql - 使用带有自定义分隔符的 postgres 按字符大小复制文本文件

python - 将 Python 数组输入 Perl 脚本

perl - 有没有办法从 XS 访问 perl 中的特殊标记?

java - 如何将 CSV 文件转换为 OpenTSDB 格式

java - 使用 opencsv (java) 读取 .csv 文件时跳过空行