我想将数据库中的一组行保存到 csv 文件。
考虑到数据是 ascii 字符,没有任何奇怪的字符,以下内容就足够了吗?
my $csv_row = join( ', ', @$row );
# save csv_row to file
我担心的是,这是否会创建任何工具都可以接受为 CSV 的行,例如不关心引用等。
更新:
这有什么区别吗?
my $csv = Text::CSV->new ( { binary => 1, eol => "\n"} );
my $header = join (',', qw( COL_NAME1 COL_NAME2 COL_NAME3 COL_NAME4 ) );
$csv->print( $fh, [$header] );
foreach my $row ( @data ) {
$csv->print($fh, $row );
}
这给了我第一行:
" COL_NAME1,COL_NAME2,COL_NAME3,COL_NAME4"
请注意双引号,其余行不带任何引号。
与我的普通 join
有什么区别?我还需要二进制
集吗?
最佳答案
最安全的方法应该是用逗号分隔符编写干净的记录。越简单越好,特别是现实生活中的格式有如此多的变化。如果需要,请对每个字段加双引号。
使用该模块的真正优势在于读取“现实生活”数据。但使用它来写作也是非常有意义的,因为它是 CSV 的统一方法。此外,还可以以清晰的方式设置选项,并且该模块可以消除数据中的一些故障。
Text::CSV文档告诉我们有关binary
选项
Important Note: The default behavior is to accept only ASCII characters in the range from
0x20
(space) to0x7E
(tilde). This means that the fields can not contain newlines. If your data contains newlines embedded in fields, or characters above0x7E
(tilde), or binary data, you must setbinary => 1
in the call tonew
. To cover the widest range of parsing options, you will always want to set binary.
我会说使用它。由于您编写了一个文件,因此这可能是选项以及 eol
(或使用 say
方法)。但请扫描许多有用的选项并查看它们的 defaults .
对于 header ,print
方法需要一个数组引用,其中每个字段都是一个元素,而不是具有逗号分隔字段的单个字符串。所以说是错误的
my $header = join (',', qw(COL_NAME1 COL_NAME2 COL_NAME3 COL_NAME4)); # WRONG
$csv->print( $fh, [$header] );
因为 $header
是一个字符串,然后它成为由 [ ... ]
创建的(匿名)数组引用的唯一元素。因此,它将此字符串打印为行中的第一个字段,并且由于它在其中检测到分隔符 ,
本身,因此它也使用双引号。相反,你应该有
$csv->print($fh, [COL_NAME1 COL_NAME2 COL_NAME3 COL_NAME4]);
或者更好地将列名称分配给@header
,然后执行$csv->print($fh,\@header)
。
这也是为什么使用模块进行写入的好处的一个例子 - 如果逗号滑入数组的一个元素(应该是单个字段),则可以通过双引号正确处理它。
一个完整的例子
use warnings;
use strict;
use Text::CSV_XS;
my $csv = Text::CSV->new ( { binary => 1, eol => "\n" } )
or die "Cannot use CSV: " . Text::CSV->error_diag();
my $file = 'output.csv';
open my $fh_out , '>', 'output.csv' or die "Can't open $file for writing: $!";
my @headers = qw( COL_NAME1 COL_NAME2 COL_NAME3 COL_NAME4 );
my @data = 1..4;
$csv->print($fh_out, \@headers);
$csv->print($fh_out, \@data);
close $fh_out;
什么产生文件output.csv
COL_NAME1,COL_NAME2,COL_NAME3,COL_NAME4 1,2,3,4
关于perl - 将行保存为 csv 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45629000/