This question already has answers here:
Replace commas with pipes, but not the commas enclosed in double quotes
(3个答案)
4年前关闭。
我有一个非常大的文件,需要使用Perl进行解析。文件格式(我无法更改)最初是为了允许文件以CSV格式在Excel中打开而编写的。专门针对此问题,我需要用管道(|)替换每行中的定界符。通常,这不是一件容易的事,但是我有几个问题(如下),尽管我有解决方案,但我想知道是否有更有效的方法来完成任务。
数据本身包含带逗号的注释(这意味着我找不到和替换逗号)
每个“单元格”中有价值的数据都封装在引号中,但是如果单元格为空,则不存在引号
文件中的示例行:
我当前的解决方案看起来像下面的代码。它可以工作,但看起来不太优雅,并且需要多次处理每一行(由于此文件非常大,我想避免这种情况)。
有人可以帮我找到更快,更优雅的解决方案吗?
(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 answer至Replace commas with pipes, but not the commas enclosed in double quotes中的代码。
09-15 12:48