在csv文件中查找并替换Perl

在csv文件中查找并替换Perl,perl,csv,replace,Perl,Csv,Replace,我一直在研究CSV文件的查找和替换示例,但我似乎什么都做不到,我希望能得到一些帮助。在windows上运行此功能 我必须处理一个格式不好的CSV文件,其中逗号和双引号都位于错误的位置 示例CSV: Device,Block,Block,Block Value,Power,Current(Best", Set," Ex),Power Data, 3, 4, 3 在处理之前,我想将“,”替换为“。目标是当前(最佳设置)将在一列中 Perl脚本(更新):sanitize.pl use warning

我一直在研究CSV文件的查找和替换示例,但我似乎什么都做不到,我希望能得到一些帮助。在windows上运行此功能

我必须处理一个格式不好的CSV文件,其中逗号和双引号都位于错误的位置

示例CSV:

Device,Block,Block,Block
Value,Power,Current(Best", Set," Ex),Power
Data, 3, 4, 3
在处理之前,我想将
“,”
替换为
。目标是
当前(最佳设置)
将在一列中

Perl脚本(更新):sanitize.pl

use warnings;
use strict;

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

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

我手头没有要检查的Unix框,但我注意到的第一件事是

perl -p -i.backup -e 's/", /_/g' .\perltest.csv
您误解了
-i
开关

如果您很勇敢,您可能需要一个裸露的
-i
(它将在没有备份的情况下修改文件),或者类似于
-i.back
的东西,它将保留原始文件的内容,并在名称后面附加
.back

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

我会写一个脚本(正如@Borodin在评论中建议的那样)。首先,只需将修改后的文本写到STDOUT

    use warnings;
    use strict;

    while (<>) {
        s/," /_/g;
        s/", /_/g;
        print ;
    }
我假设您在Windows上,在这种情况下,您需要双引号
而不是单引号
。它将
\perltest.csv
解释为
-e

如果您坚持使用一行,请使用以下命令-但我不喜欢将
引用为
\”
。 当你感到满意时,添加
-i.bak

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

我接受了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);
使用英语;
就地消毒{
我的($filename、$pattern1、$pattern2、$replacement1)=@;
local@ARGV=($filename),
$INPLACE_EDIT='.back';
而(){
s/\Q$pattern1/$replacement1/g;
s/\Q$pattern2/$replacement1/g;
印刷品;
}
}
$filename='perltest.csv';
$pattern1='”,';
$pattern2=',“';
$replacement1=''uu';
&就地消毒($filename、$pattern1、$pattern2、$replacement1);

您应该编写一个Perl程序,而不是试图在一个命令行上完成全部工作。这样您将获得更好的诊断信息。抱歉,它已被编辑。我把它作为一个脚本运行,现在作为一个单行命令,我将切换到使用powershell脚本,这就足够了<代码>[io.file]::readalltext(“p:\pstest.csv”).replace(“,”,“”)| Out file“p:\psreplaced.csv”-encoding ascii-force如果我运行
-I.back
它说它无法打开perl脚本。back::没有这样的文件
perl-I.back-pe's/”,/\ug'perltest.csv
谢谢!我的-i.back上的任何想法都会说无法打开perl脚本“.back”?正如我所展示的,它工作正常。请显示用于实现此效果的命令行。
perl-i.back-pe's/“,/\ug'perltest.csv
返回“无法打开perl脚本”.back”:没有此类文件或目录“谢谢你的帮助,但我不能让奥里格工作。如果我不包括就地备份,它也不会让我运行它。请在每个Perl程序开始时始终
使用strict
使用warnings
a;不要使用英语;始终正确缩进程序;不要分配给
@ARGV
,或者至少不要公开分配;不要尝试在Windows上进行就地编辑-它已损坏;千万不要用符号和
&
调用子例程。哦,不要使用PowerShell:)
     perl -p  -e "s/,\" /_/g" perltest.csv    
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);