在包含引号的字符串上使用Text::CSV



我仔细研究了这个网站(和其他网站(,试图找到答案,但没有成功。

use Text::CSV;
my $csv = Text::CSV->new ( { binary => 1, auto_diag => 1 } );
$line = q(data="a=1,b=2",c=3);
my $csvParse  = $csv->parse($line);
my @fields = $csv->fields();
for my $field (@fields) {
print "FIELD ==> $fieldn";
}

这是输出:

# CSV_XS ERROR: 2034 - EIF - Loose unescaped quote @ rec 0 pos 6 field 1
FIELD ==> 

我期待2个数组元素:

data="a=1,b=2"
c=3

我错过了什么?

您可以使用Text::ParseWords。由于您没有使用真正的csv,因此可能没问题。示例:

use strict;
use warnings;
use Data::Dumper;
use Text::ParseWords;
my $line = q(data="a=1,b=2",c=3);
my @fields = quotewords(',', 1, $line);
print Dumper @fields;

这将打印

$VAR1 = [
'data="a=1,b=2"',
'c=3'
];

按照你的要求。您可能需要进一步测试您的数据。

您的输入数据不是"标准";CSV,至少不是Text::CSV期望的那种,也不是Excel之类的东西产生的那种。整个字段必须引用或根本不引用。";标准";它的编码将是"data=""a=1,b=2""",c=3(您可以通过要求Text::CSV使用say打印您期望的数据来查看(。

如果您将allow_loose_quotes选项传递给Text::CSV构造函数,它不会在您的输入中出错,但不会认为引号是";保护";逗号,因此您将获得三个字段,即data="a=1b=2"c=3

最新更新