在包含引号的字符串上使用 Text::CSV
Using Text::CSV on a String Containing Quotes
我仔细研究了这个网站(和其他网站)试图收集这个问题的答案但没有成功。
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 ==> $field\n";
}
这是输出:
# CSV_XS ERROR: 2034 - EIF - Loose unescaped quote @ rec 0 pos 6 field 1
FIELD ==>
我需要 2 个数组元素:
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=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'
];
如您所愿。您可能想进一步测试您的数据。
我仔细研究了这个网站(和其他网站)试图收集这个问题的答案但没有成功。
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 ==> $field\n";
}
这是输出:
# CSV_XS ERROR: 2034 - EIF - Loose unescaped quote @ rec 0 pos 6 field 1
FIELD ==>
我需要 2 个数组元素:
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=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'
];
如您所愿。您可能想进一步测试您的数据。