perl - 将行保存为 csv 格式

标签 perl csv

我想将数据库中的一组行保存到 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) to 0x7E (tilde). This means that the fields can not contain newlines. If your data contains newlines embedded in fields, or characters above 0x7E (tilde), or binary data, you must set binary => 1 in the call to new. 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/

相关文章:

r - 大型 csv 文件无法完全读入 R data.frame

python - 创建 CSV、压缩它并通过电子邮件附加的最佳方式

perl - 请求 <STDIN> 时建议一个值

如果字符串未夹在两个标记之间则要匹配的正则表达式

javascript - 从 Javascript 调用 perl 文件/函数和函数来更新 HTML

linux - perl 内存不足错误

perl - 如何使用 Perl 获得频率序列的递减累积?

python - Pandas read_csv() 有条件地跳过标题行

python-3.x - 如何查找tensorflow.python.data.ops.dataset_ops.MapDataset对象的大小或形状,make_csv_dataset的输出

java - 使用 split 解析分隔文本文件