使用Text :: CSV写入输出是否有附加价值?

ND *_*eek 2 csv perl

如果我将表格输出作为CSV写入文件,那么加载额外模块Text::CSV 并将我的数据转换为对象有什么好处 让我通过基本循环和字符串操作?我已经看到了一些建议这样做的答案:如何在Perl中使用DBI获取列名和行数据以及如何使用Perl创建CSV文件.

加载一个完整的模块对于我可以在四行Perl中编写的东西(忽略数据检索等)来说似乎有点过分和巨大的开销:

my $rptText = join(',', map { qq/"$_"/ } @head) . "\n";

foreach my $person ( @$data ) {
    $rptText .= join(',', map { qq/"$person->{$_}"/ } @head) . "\n";
}
Run Code Online (Sandbox Code Playgroud)

那么什么加载 Text::CSV 让我通过上面的代码?

Mic*_*man 7

对于简单的琐碎数据(不可否认,这很常见),没有任何优势.你可以join,print然后继续你的快乐方式.对于快速丢弃的脚本,您可能只需要(如果您需要查阅Text :: CSV文档,也可以更快).

当您的数据非常重要时,优势就开始了.

  • 它是否包含逗号?
  • 它是否包含双引号?
  • 它是否包含换行符?
  • 它是否包含非ASCII字符?
  • undef(无值)和''(空字符串)之间有区别吗?
  • 您是否需要使用不同的分隔符(或让用户指定它)?

对于生产代码,标准的亲模块建议适用:

  • 重用而不是重新发明(特别是如果你要生成多个CSV文件)
  • 它使您的代码更清晰(更一致,更好地分离关注点)
  • CPAN模块通常更快(更好地优化),更强大(边缘案例处理),并且具有比内部解决方案更清晰的API.
  • 加载模块的开销几乎肯定不是问题.


cho*_*oba 5

如果$person->{col1}包含,您的CSV将无效".此外,所有列都将用双引号括起来,这可能是不可取的(例如数字).您还将获得""未定义的值,如果您计划将CSV加载到区分null和之间的数据库中,这可能不起作用''.