问题是错误的,因为它代表了 - 我的代码中的一些中间行导致了问题。当我找到它们时我会编辑它。很多道歉。
假设CSV中的第一个单元格中包含单引号(')。假设您使用Perl的Text :: CSV和$row = $csv->getline($csv_file)
读取CSV。然后第一个单元格将在$row->[0]
中。其中的单引号将被转义。
你如何阻止它逃脱? (我并不是说你如何在事后取代逃脱的报价。)http://search.cpan.org/perldoc?Text::CSV_XS
似乎没有这个选项。(此问题特定于Text :: CSV。使用foreach (<$csv_file>)
读取文件并不会逃脱。)
根据要求,这是我的代码如何开始(完整代码):
use Text::CSV;
my $csv = Text::CSV->new({ binary => 1, escape_char => "\\", sep_char => '}', quote_char => '`' });
open my $csv_file, "<:encoding(utf8)", "filepath.csv";
答案 0 :(得分:2)
我无法理解使用右括号作为字段分隔符的数据形式。我怀疑您使用错误的工具来解析数据。
但是,我怀疑你正在查看Data::Dumper
的输出并在那里看到反斜杠。
这个简短的程序使用您自己的代码并演示我的意思。输出显示第一个字段为'aaa\'aaa'
,其中Data::Dumper
已转义嵌入的单引号,因为它使用单引号来分隔字符串。 Data::Dumper
的输出旨在使用do
或eval
执行,以重建原始数据。
use strict;
use warnings;
use Text::CSV;
use Data::Dumper;
my $csv = Text::CSV->new({ binary => 1, escape_char => "\\", sep_char => '}', quote_char => '`' });
#open my $csv_file, "<:encoding(utf8)', 'filepath.csv';
while (my $row = $csv->getline(*DATA)) {
print Dumper $row;
}
__DATA__
aaa'aaa}bbb}ccc
<强>输出强>
$VAR1 = [
'aaa\'aaa',
'bbb',
'ccc'
];
注意我认为Data::Dump
远远优于Data::Dumper
。对于相同的代码,它显示像这样的数据
["aaa'aaa", "bbb", "ccc"]
答案 1 :(得分:1)
我无法重现所描述的行为:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Text::CSV;
my $csv = 'Text::CSV'->new;
while (my $row = $csv->getline(*DATA{IO})) {
say for @$row
}
__DATA__
"a'b",123,x'y
输出:
a'b
123
x'y
我安装了Text::CSV_XS。