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



如果我将表格输出作为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";
}

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

对于简单的琐碎数据(诚然,这是很常见的),没有任何优势。你可以joinprint,然后继续你的快乐之路。对于快速的一次性脚本,这可能是您所需要的(如果您需要查阅 Text::CSV 文档,速度也更快)。

当您的数据不平凡时,优势就开始了。

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

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

  • 重用而不是重新发明(特别是如果您要生成多个 CSV 文件)
  • 它使您的代码更简洁(更一致,关注点分离更好)
  • CPAN 模块通常比内部解决方案更快(优化得更好)、更健壮(边缘情况处理),并且具有更干净的 API。
  • 加载模块的开销几乎可以肯定不是问题。

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

最新更新