如何使用 Perl 创建 CSV 文件?

Posted

技术标签:

【中文标题】如何使用 Perl 创建 CSV 文件?【英文标题】:How do I create a CSV file using Perl? 【发布时间】:2010-11-29 11:14:57 【问题描述】:

我想使用 Perl 创建一个 CSV 文件并向其中写入一些数据。有什么办法吗?

【问题讨论】:

【参考方案1】:

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

编辑:更多库,可以search CPAN。

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是最好的选择。 Text::CSV_XS 经过高度优化,功能齐全,API 流畅。我们全部使用它。在我看来,作者也是对所有 CPAN 响应最快的人,他为该模块感到自豪并提供一流的支持。如果您无法为 _XS 进行编译,Text::CSV_PP 也是一个很好的后备方案,如果您以后需要它,那就太好了。如果您仅使用 Text::CSV,那么这些天就会发生正确的事情 同意最后一句话:只要使用 Text::CSV,如果它可用,它将加载 Text::CSV_XS,如果系统没有 XS 版本,它将回退到 Text::CSV_PP已安装。 @szabgab 您能否提供一个在您的答案中使用 Text::CSV 创建 CSV 的示例?我正在阅读文档,它似乎非常专注于解析 CSV,不太清楚如何创建一个。【参考方案3】:

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

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";

只需运行您的脚本并将输出重定向到一个文件,砰!你完成了。或者你可能会发疯并open 一个文件句柄,然后直接打印到一个文件。

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

我的建议:

如果您正在构建 POE 应用程序,使用 POE::Filter。 如果你是一个 SQL/DBI 怪物并梦想在 SQL,或者可能需要替换 CSV 使用真实数据库输出 连接,使用 DBD::SQL。 如果您有 简单的数据,正在拼凑在一起 一个简陋的一次性脚本 为您的电子表格格式化一些数据 消化、使用打印和加入 - 对预期寿命超过 2 小时的无代码执行此操作。 如果你 想将一团数据转储到 CSV 或 XML 使用 Data::Tabular::Dumper::CSV。 如果您正在编写需要稳定、可维护和快速的内容,并且需要最大程度地控制输入和输出,请使用 Text::CSV。 (注意 POE::Filter::CSV、Data::Tabular::Dumper::CSV 和 DBD::CSV 都使用 Text::CSV 或 Text::CSV_XS 作为后端处理)。

【讨论】:

以上是关于如何使用 Perl 创建 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如果使用Perl不存在目录,我该如何创建目录?

在 Perl 中,如何从文件中删除 ^M?

如何使用正则表达式解析 Perl 中引用的 CSV?

如何强制 Text::CSV 将数字存储为文本?

Perl 解析 csv 文件并迭代 curl

perl处理fasta文件