我一直在研究查找和替换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”:没有这样的文件或目录
答案 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
如果您坚持使用单行班,请使用以下内容 - 但我不想引用"
作为\"
。
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);