我正在编写一些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)
您可以选择输出中需要多少个前导零,并使所有列的读数相同。