在csv文件中查找和替换Perl

时间:2014-03-05 23:18:26

标签: perl csv replace

我一直在研究查找和替换CSV文件的示例,但我似乎无法获得任何工作,我希望得到一些帮助。在Windows上运行它。

我必须处理格式不正确的CSV文件,其中逗号和双引号都在错误的位置。

示例CSV:

Device,Block,Block,Block
Value,Power,Current(Best", Set," Ex),Power
Data, 3, 4, 3

我希望在处理之前将'", '替换为'_'。目标是Current(Best_Set_Ex)将在一列中。

Perl脚本(已更新):sanitize.pl

use warnings;
use strict;

while (<>) {
    s/," /_/g;
    s/", /_/g;
    print ;
}

命令:

perl -p -i.orig sanitize.pl perltest.csv

错误:无法打开perl脚本“orig”:没有这样的文件或目录

3 个答案:

答案 0 :(得分:1)

我没有可以检查的Unix盒子,但我注意到的第一件事是

perl -p -i.backup -e 's/", /_/g' .\perltest.csv

是你误解了-i开关。

如果你是勇敢的(它将在没有备份的情况下就地修改文件)或类似-i之类的东西,你可能想要一个裸-i.back,这将保留原始文件的内容{ {1}}附加到名称。

其余的应该可以正常工作。

答案 1 :(得分:0)

我会写一个脚本(如评论中提到的@Borodin)。首先,只需将修改后的文本写入STDOUT

    use warnings;
    use strict;

    while (<>) {
        s/," /_/g;
        s/", /_/g;
        print ;
    }

当你快乐时,它会起作用

    perl -i.bak sanatise_quotes.pl perltest.csv

提及powershell。我假设你在Windows上,在这种情况下你需要双引号"而不是单引号'。它将\perltest.csv解释为-e

的一部分

如果您坚持使用单行班,请使用以下内容 - 但我不想引用"作为\"。 -i.bak。

     perl -p  -e "s/,\" /_/g" perltest.csv    

答案 2 :(得分:0)

我带了Borodin&amp; justintime的建议,并采用了一个程序,而不是一个班轮。谢谢你们对此的意见。我还没有解决为什么-i.back给了我无法打开perl文件“.back”。

脚本:

use English;
sub inplace_sanitize {
my ( $filename, $pattern1, $pattern2, $replacement1 ) = @_;
    local @ARGV = ( $filename ),
    $INPLACE_EDIT = '.back';
while ( <> ) {
    s/\Q$pattern1/$replacement1/g;
    s/\Q$pattern2/$replacement1/g;
print;
}
}

$filename = 'perltest.csv';
$pattern1 = '", ';
$pattern2 = '," ';
$replacement1 = '_';

&inplace_sanitize($filename, $pattern1, $pattern2, $replacement1);