使用perl和Text :: CSV获取带有空格的双引号

时间:2014-02-14 15:42:53

标签: perl csv

我正在使用Text :: CSV来构建csv文件。我需要得到像

这样的一行
10;"";LS;1000

我的问题是双引号,两者之间没有空格。我最好的猜测是

require Text::CSV::Encoded;
my $or_csv = Text::CSV::Encoded->new({
    sep_char    => ';',
    eol         => "\r\n",
    quote_char  => '"',
    quote_null  => 1,
    binary      => 1,
});

my @a_columns = (10, , 'LS', 1000);
$or_csv->combine(@a_columns);
print $or_csv->string;

但结果是

10;LS;1000

我找到解决此问题的唯一方法是禁用引用。但出于安全原因,这不是我想要的。

非常欢迎任何帮助。

3 个答案:

答案 0 :(得分:2)

正如TLP所述,一个问题是您的@a_columns初始化没有创建您认为的数组:

use strict;
use warnings;
use Text::CSV;
use Data::Dumper;

my @a_columns = ( 10,, 'LS', 1000 );
print Dumper \@a_columns;

my @b_columns = ( 10, '"', 'LS', 1000 );
print "\n", Dumper \@b_columns;

my $or_csv = Text::CSV->new(
    {
        sep_char   => ';',
        eol        => "\r\n",
        quote_char => '',
        binary     => 1,
        quote_null => 1
    }
);

$or_csv->combine(@b_columns);
print "\n", $or_csv->string;

输出:

$VAR1 = [
          10,
          'LS',
          1000
        ];

$VAR1 = [
          10,
          '"',
          'LS',
          1000
        ];

10;"";LS;1000

请注意,第二个列表中的'"'会生成所需的数组结果,提供quote_char => ''

希望这有帮助!

答案 1 :(得分:0)

my @a_columns = (10, '', 'LS', 1000);

ThisSuitIsBlackNot评论后修改。

答案 2 :(得分:0)

实际上,你不想要的是你的第二列是两个双引号。 除非您打算让其他应用程序将其视为空字符串。但是,您的示例显示的内容看起来像十,没有,LS,千

首先,$csv->combine的输入与所有函数和方法一样是 LIST 。多个逗号表示列表中有 undefined 元素。因此,您最终只有三列。

或者: 传递像""这样的空字符串 要么 通过undef

只需设置always_quote => 1即可。然后在读回并将CSV解析为Perl时,选项blank_is_undef => 1现在会告诉您它是否为空字符串或未定义。

但是......如果你真的必须坚持:

use strict;
use warnings;

use Text::CSV;

my $csv = Text::CSV->new();

my $double_quotes_here = '<=- -=>'; # some fancy string WITH a space-character

$csv->combine(10, $double_quotes_here, 'LS', 1000);

my $csv_string = $csv->string;
$csv_string =~ s/$double_quotes_here//g;
print $csv_string, "\n";
祝你好运!