我正在使用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
我找到解决此问题的唯一方法是禁用引用。但出于安全原因,这不是我想要的。
非常欢迎任何帮助。
答案 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)
答案 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";
祝你好运!