【问题标题】:Find and Replace in a csv file Perl在 csv 文件中查找和替换 Perl
【发布时间】:2014-04-08 07:45:29
【问题描述】:

我一直在研究有关查找和替换 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”:没有这样的文件或目录

【问题讨论】:

  • 您应该编写一个 Perl 程序,而不是试图在一个命令行上完成全部工作。这样你会得到更好的诊断信息。
  • 抱歉,已编辑。我将其作为脚本运行,现在作为单行命令运行
  • 我正在切换到使用足够的 powershell 脚本。 [io.file]::readalltext("p:\pstest.csv").replace('", ',"_") | Out-File "P:\psreplaced.csv" -enconding ascii -force

标签: perl csv replace


【解决方案1】:

我没有要检查的 Unix 盒子,但我首先注意到的是

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

是你误解了-i开关。

如果你很勇敢,你可能想要一个裸露的-i(它会在没有备份的情况下就地修改文件)或者像-i.back这样的东西,它将保留原始文件的内容并附加.back名字。

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

【讨论】:

  • 如果我运行 -i.back 它说它无法打开 perl 脚本“.back”:没有这样的文件
  • perl -i.back -pe 's/", /_/g' perltest.csv
  • 欣赏!我的 -i.back 上的任何想法都会说 Can't open perl script ".back" ??
  • 它工作得很好,正如我所展示的那样。请显示您用于获得此效果的命令行。
  • perl -i.back -pe 's/", /_/g' perltest.csv 返回“无法打开 perl 脚本“.back”:没有这样的文件或目录”
【解决方案2】:

我会写一个脚本(正如@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    

【讨论】:

  • 感谢您的帮助,但我无法让 -i.orig 工作。如果我不包括就地备份,它也不会让我运行它。
【解决方案3】:

我接受了 Borodin 和 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);

【讨论】:

  • 拜托,总是 use strictuse warnings 是每个 Perl 程序的开始;不要use English;总是正确地缩进你的程序;不要分配给@ARGV,或者至少不要公开;不要尝试在 Windows 上进行就地编辑 - 它已损坏;并且从不调用带有&符号&amp;的子例程。哦,不要使用 PowerShell :)
猜你喜欢
  • 2017-01-10
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多