This question already has answers here:
Replace commas with pipes, but not the commas enclosed in double quotes

(3个答案)


4年前关闭。





我有一个非常大的文件,需要使用Perl进行解析。文件格式(我无法更改)最初是为了允许文件以CSV格式在Excel中打开而编写的。专门针对此问题,我需要用管道(|)替换每行中的定界符。通常,这不是一件容易的事,但是我有几个问题(如下),尽管我有解决方案,但我想知道是否有更有效的方法来完成任务。


数据本身包含带逗号的注释(这意味着我找不到和替换逗号)
每个“单元格”中有价值的数据都封装在引号中,但是如果单元格为空,则不存在引号


文件中的示例行:

"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


有人可以帮我找到更快,更优雅的解决方案吗?

最佳答案

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

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

09-15 12:48