我正在使用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";
祝你好运!