在Perl中替换Quote-and-Multiple-Comma Delimiters

时间:2016-06-24 18:45:18

标签: regex perl csv

我有一个非常大的文件需要用Perl解析。最初编写的文件格式(我无法更改)允许文件在Excel中以CSV格式打开。特别是对于这个问题,我需要用管道(|)替换每一行中的分隔符。通常这不是一项艰苦的工作,但我有一些问题(下面),虽然我确实有一个解决方案,但我想知道是否有更有效的方法来完成我的任务。

  1. 数据本身包含带逗号的注释(意味着我无法在逗号中找到并替换)
  2. 每个“单元格”的数据都用引号括起来,但如果单元格为空,则不存在引号
  3. 文件中的行示例:

    "Foo Bar","More Foo","More Bar",,,,,"Yet More","Comma,Separated,Statement"
    

    我当前的解决方案类似于下面的代码。它可以工作,但它似乎不优雅,需要多次处理每一行(我想避免这个文件非常大)。

    # Change the delimiter
    $line =~ s/",,,,,"/|||||/g;
    $line =~ s/",,,,"/||||/g;
    $line =~ s/",,,"/|||/g;
    $line =~ s/",,"/||/g;
    $line =~ s/","/|/g;
    
    $line =~ s/^"//;     # Remove leading quotation mark
    $line =~ s/"$//;     # Remove trailing quotation mark
    

    那里的任何人都可以帮我找到更快更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

使用Text::CSV_XS。读取每一行,获取每个值,然后使用管道重新加入。让模块为您处理所有格式问题。

请参阅friedo's answerReplace commas with pipes, but not the commas enclosed in double quotes中的代码。