基於映射文件,我需要搜索字符串,如果找到,則將替換字符串附加到行尾。 我正在逐行遍歷映射文件,並使用下面的perl單行,附加字符串。Perl一次性查找並替換多個(巨大)字符串
問題:
1.Huge找到&替換項:但問題是映射文件條目的數量巨大(〜7000項)和Perl俏皮話需要約1秒,每個條目這歸結爲〜1小時以完成整個更換。
2.不簡單查找和替換:它不是一個簡單的查找&替換。它是 - 如果找到字符串,則將替換字符串附加到EOL。 如果沒有有效的方法來處理這個,我甚至會考慮替換而不是追加。
我在Windows 7 64位環境下使用主動perl。沒有* unix支持。
文件樣品
Map.csv
findStr1,RplStr1
findStr2,RplStr2
findStr3,RplStr3
.....
findStr7000,RplStr7000
input.csv
col1,col2,col3,findStr1,....col-N
col1,col2,col3,findStr2,....col-N
col1,col2,col3,FIND-STR-NOT-EXIST,....col-N
output.csv(預期輸出)
col1,col2,col3,findStr1,....col-N,**RplStr1**
col1,col2,col3,findStr1,....col-N,**RplStr2**
col1,col2,col3,FIND-STR-NOT-EXIST,....col-N
的Perl代碼段
一個班輪
perl -pe '/findStr/ && s/$/RplStr/' file.csv
open(INFILE, $MarketMapFile) or die "Error occured: $!";
my @data = <INFILE>;
my $cnt=1;
foreach $line (@data) {
eval {
# Remove end of line character.
$line =~ s/\n//g;
my ($eNodeBID, $MarketName) = split(',', $line);
my $exeCmd = 'perl -i.bak -p -e "/'.$eNodeBID.'\(M\)/ && s/$/,'.$MarketName.'/;" '.$CSVFile;
print "\n $cnt Repelacing $eNodeBID with $MarketName and cmd is $exeCmd";
system($exeCmd);
$cnt++;
}
}
close(INFILE);
部分爲什麼需要這麼長時間,你分叉爲每一個新的Perl程序循環中的線。你不應該那樣做。 –
您匹配的字符串是否總是位於CSV的第4列? – ThisSuitIsBlackNot
@ThisSuitIsBlackNot Yes.The搜索字符串列的位置始終是固定的 – Siva