获取双引号,在 perl 和 Text::CSV 之间有空格



我正在使用Text::CSV来构建csv文件。我需要得到一条这样的行

10;"";LS;1000

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

require Text::CSV::Encoded;
my $or_csv = Text::CSV::Encoded->new({
    sep_char    => ';',
    eol         => "rn",
    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

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

非常欢迎任何帮助。

正如 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        => "rn",
        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 => ''

希望这有帮助!

试试

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

在此之后修改了西装是黑色不评论。

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

因此,首先,$csv->combine的输入是 LIST,就像所有函数和方法一样。多个逗号并不意味着列表中存在未定义的元素。因此,您最终只剩下三列。

也:传递一个空字符串,如 ""或通过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";

祝你好运!

最新更新