使用Perl如何创建CSV文件?

24
我想使用Perl创建一个CSV文件并将一些数据写入其中。是否有办法可以做到这一点?
3个回答

27
你可以使用 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

编辑:如需更多库,您可以搜索CPAN


18

6
这是最佳选择。Text::CSV_XS高度优化,具有完整的功能和流畅的API。我们在各个地方都使用它。作者也是我在CPAN上看到的最具响应性的人,他为这个模块感到自豪并提供一流的支持。如果不能编译_XS,则Text::CSV_PP也是一个很好的备选方案,如果以后需要它,它也非常出色。如果你简单地使用Text::CSV,现在就会发生正确的事情。 - Evan Carroll
2
同意最后一句话:只需使用Text::CSV,它将加载Text::CSV_XS(如果可用),或者在系统未安装XS版本时回退到Text::CSV_PP。 - Dave Sherohman
3
请问能否在您的回答中提供使用Text::CSV创建CSV文件的示例呢?我正在阅读文档,但它似乎过于专注于解析CSV,对如何创建CSV并不十分清晰。 - Francisco Zarabozo

13

有不止一种方法可以完成它。

  • DBD::CSV - 使用SQL读写CSV文件。
  • Text::CSV - 逐行构建和解析CSV文件。这基本上是CSV操作的黄金标准。
  • POE::Filter::CSV - 为您的POE组件IO提供CSV过滤器。
  • Data::Tabular::Dumper::CSV - 直接将表转储到CSV文件中(具有相同接口的对象可以转储到XML或MS Excel文件中)。

CPAN上还有很多其他选择。

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

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

for my $row ( @table ) {
    print join( ',', @$row ), "\n";
}

只需运行脚本并将输出重定向到文件,完成!或者你可以疯狂地打开文件句柄,并直接打印到文件中。

但是,这种数据处理任务中可能会出现多行字段、嵌入逗号或其他许多奇怪的情况。因此,请小心使用此方法。

我的建议:

  • 如果您正在构建POE应用程序,请使用POE::Filter。
  • 如果您是SQL/DBI怪物,并且梦想着SQL,或者可能需要将CSV输出替换为真正的数据库连接,请使用DBD::SQL。
  • 如果您有简单的数据,并且正在拼凑一个粗糙的小脚本来格式化一些数据以供电子表格消化,请使用print和join——做这个事情不需要超过2小时的代码寿命。
  • 如果您想将数据块转储到CSV或XML中,请使用Data::Tabular::Dumper::CSV。
  • 如果您正在编写需要稳定、可维护和快速的内容,并且需要最大限度地控制输入和输出的东西,请使用Text::CSV。(请注意,POE::Filter::CSV、Data::Tabular::Dumper::CSV和DBD::CSV都使用Text::CSV或Text::CSV_XS作为后端处理)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接