【问题标题】:Poorly formatted CSV file (Perl)格式错误的 CSV 文件 (Perl)
【发布时间】:2014-01-20 18:28:55
【问题描述】:

我有一个如下所示的 CSV 文件:

account,name,,,,type,"$a,mount.00",description
account,name,so,me,thing,type,$amount,"description
account,name,so,me,thing
account,name,so,me,thing,type,$amount,"description"

基本上,我想清理整个文件,我认为最简单的方法是为每一列添加引号并确保每一行都有 13 列。唯一的问题是,有些列有开引号,但没有闭引号。这似乎只发生在行尾,但文件太大,我无法完全验证。

通过 Perl 清理它的最佳方法是什么?

谢谢! - 马特

【问题讨论】:

  • 你的意思是加双引号?
  • 问题在于有开引号的列,没有右引号。真的没有办法知道结束报价的去向。例如account,name,,,,type,"$a,mount.00,结束引号可以是account,name,,,,type,"$a",mount.00account,name,,,,type,"$a,mount.00"
  • 如果真的有“无法知道结束引号的去向”,那么我看不出我们可以如何帮助您。只有您足够了解您的数据,才能描述如何对其进行清理。完成后,欢迎您帮助在 Perl 中实现它。
  • @Borodin - 我不是那个说“没有办法知道”的人。
  • 是否有任何字段 data 包含逗号或双引号?

标签: regex perl csv formatting


【解决方案1】:

您可以使用Text::CSV 加载文件并让它处理清理工作。挺好的。

use strict;
use warnings;
use Text::CSV;

my @rows;
my $csv = Text::CSV->new ({ 
  binary => 1, 
  allow_loose_quotes => 1, 
  always_quote => 1 
});

while ( my $row = $csv->getline( \*DATA ) ) {
    push @rows, $row;
}

$csv->eol ("\n");
$csv->print(\*STDOUT, $_) for @rows;

__DATA__
account,name,,,,type,"$a,mount.00",description
account,name,so,me,thing,type,$amount,"description
account,name,so,me,thing
account,name,so,me,thing,type,$amount,"description"

它将产生以下输出:

"account","name","","","","type","$a,mount.00","description"
"account","name","so","me","thing","type","$amount","""description"
"account","name","so","me","thing"
"account","name","so","me","thing","type","$amount","description"

注意所有字段的引用方式。它将第二行中的单(未闭合)双引号视为文字引号,而不是字段的未闭合引号并将其转义。默认情况下,它使用双引号作为转义字符。我就这样保留了它,但您可以通过设置$csv->escape_char('\\') 或类似名称来更改它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 2016-03-25
    • 2011-07-24
    相关资源
    最近更新 更多