如何使用Perl创建CSV文件?

23 csv perl

我想使用Perl创建一个CSV文件并向其写入一些数据.有没有办法做到这一点?

小智 26

您可以使用Class:CSV.

use Class::CSV;

my $csv = Class::CSV->new(
  fields         => [qw/userid username/]
);

$csv->add_line([2063, 'testuser']);
$csv->add_line({
  userid   => 2064,
  username => 'testuser2'
});

$csv->print();

# 2063,testuser
# 2064,testuser2
Run Code Online (Sandbox Code Playgroud)

编辑:对于更多库,您可以搜索CPAN.


DVK*_*DVK 18

我们经常使用Text::CSV_XS(上面提到的Class::CSV是基于)

更新:下面的评论者还建议使用Text::CSV哪些将加载,Text::CSV_XS或者如果不可用,则回退到Text::CSV_PP没有XS依赖性并且可能更容易安装.

  • 这是最好的选择.Text :: CSV_XS经过高度优化,功能齐全,API流畅.我们全都用它.在我看来,作者对CPAN的反应最为敏感,他为模块感到自豪,并提供一流的支持.如果你不能为_XS编译,Text :: CSV_PP也是一个很好的后备,如果你以后需要它很好.如果您只使用Text :: CSV,这些日子就会发生正确的事情 (6认同)
  • @szabgab您能否提供一个在答案中使用Text :: CSV创建CSV的示例?我正在阅读文档,它似乎非常专注于解析CSV,而不是很清楚如何创建一个. (3认同)
  • 同意最后一句:只使用Text :: CSV,如果系统没有安装XS版本,它将加载Text :: CSV_XS(如果可用)或回退到Text :: CSV_PP. (2认同)

dao*_*oad 13

有不止一种方法可以做到这一点.

CPAN上还有很多其他的.

当然,您可以忽略所有这些,只需使用循环,连接和打印:

my @table = (
  [ 'a', 'b', 'c'],
  [  1,   2,   3 ],
  [  2,   4,   6 ],
);

for my $row ( @table ) {
    print join( ',', @$row ), "\n";
}
Run Code Online (Sandbox Code Playgroud)

只需运行您的脚本并将输出重定向到文件,爆炸!你完成了 或者您可能会疯狂并打开文件句柄,并直接打印到文件.

但是,您将无法处理多行字段,嵌入式逗号,或者在此类数据处理任务中可能出现的任何其他奇怪现象.所以要小心这种方法.

我的建议:

  • 如果要构建POE应用程序,请使用POE :: Filter.
  • 如果您是SQL中的SQL/DBI怪物和梦想,或者可能需要用真实数据库连接替换CSV输出,请使用DBD :: SQL.
  • 如果您有简单的数据,并且正在拼凑一个肮脏的小丢弃脚本来格式化您的电子表格要消化的数据,请使用print和join - 这样做的代码是预期寿命超过2小时的代码.
  • 如果要将数据blob转储为CSV或XML,请使用Data :: Tabular :: Dumper :: CSV.
  • 如果您正在编写需要稳定,可维护且快速的内容,并且需要对输入和输出进行最大程度的控制,请使用Text :: CSV.(注意,POE :: Filter :: CSV,Data :: Tabular :: Dumper :: CSV和DBD :: CSV都使用Text :: CSV或Text :: CSV_XS作为后端处理).