如何阻止Text :: CSV转义单引号?

时间:2014-05-18 19:31:32

标签: perl csv

问题是错误的,因为它代表了 - 我的代码中的一些中间行导致了问题。当我找到它们时我会编辑它。很多道歉。

假设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";

2 个答案:

答案 0 :(得分:2)

我无法理解使用右括号作为字段分隔符的数据形式。我怀疑您使用错误的工具来解析数据。

但是,我怀疑你正在查看Data::Dumper的输出并在那里看到反斜杠。

这个简短的程序使用您自己的代码并演示我的意思。输出显示第一个字段为'aaa\'aaa',其中Data::Dumper已转义嵌入的单引号,因为它使用单引号来分隔字符串。 Data::Dumper的输出旨在使用doeval执行,以重建原始数据。

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