如何强制Text::CSV将数字存储为文本



我正在编写一些perl代码,使用Text::csv模块从数据库中的记录创建.csv文件。有时,我的表中的一个或多个字段将包含多个重复的0,这些0将作为单个0写入CSV。我正试图找出如何将数字强制设置为文本格式,这样这些字段中的所有0都将保持原样。

use Text::CSV_XS;
sub write_file {
my ($self, %params) = @_;
my $fh = $params{fh};
.. do stuff
.. get database rows
my $csv = Text::CSV_XS->new({ sep_char => ',' });

for my $row (@$rows) {
my @fields = (
$row->{name},
$row->{address},
$row->{code}
);
$csv->combine(@fields);
print $fh $csv->string . "rn"
or die 'Write error.';
}

使用这种方法,大多数情况下一切看起来都很好。但是,当代码以";00000";,它被截断并写为"0";0";在我的CSV中。

我已经研究了$csv->types,但这只允许在解析期间解码时定义类型。

我还尝试过使用$csv->quote(@fields)将字段用引号括起来,但没有成功。

参考always_quote(),强制组合字段引用

use Text::CSV_XS;
my $csv = Text::CSV_XS->new( { sep_char => ',' } );
my @fields = ( "0", "00", "000" );
$csv->combine(@fields);
print $csv->string . "n";
$csv->always_quote(1);
$csv->combine(@fields);
print $csv->string . "n";

导致

0,00,000
"0","00","000"

规范化数据

如果问题是

  • 您想要前导0
  • 输入中的前导零NOT有效(即科学记数法(

然后您可以简单地使用sprintf对数据进行标准化

$x = 5;
print sprintf("%05d", $x)

您可以选择输出中需要多少个前导零,并使所有列的读数相同。

最新更新