2013-02-19 67 views
0

我正在研究一个perl脚本,该脚本会查找客户服务信息并更改服务标识。我现在的代码可以采用2列csv文件作为参考,并交换数字,但是当我尝试使用“\ n”或“\ |”时像我需要,它会给我的`OL:未终止的命令

“的sed:-e表达式#1,焦炭29:未结束的'S'命令”

这里是我的,对于只改变了作品数量原代码引号内:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Text::CSV; #load Text::CSV module for parsing CSV 
use LWP::Simple; #load LWP module for doing HTTP get 

my $file = 'sid_swap.csv'; #CSV file to parse and load 
my $csv = Text::CSV->new(); #create a new Text::CSV object 

open (CSV, "<", $file) or die $!; #open CSV file for parsing 

while (<CSV>) { 
    if ($csv->parse($_)) { 

     my @columns = $csv->fields(); #parse csv files and load into an array for each row 
     my $newSID = $columns[0]; 
     my $oldSID = $columns[1]; 
     system("sed -i 's/\<row SERVICE_MENU_ID=\"$oldSID\"/\<row SERVICE_MENU_ID=\"$newSID\"/g' customer_data.txt"); 

    } else { 
     my $err = $csv->error_input; 
     print "Failed to parse line: $err"; 
    } 
} 
close CSV; 

这里是新的代码抛出错误:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Text::CSV; #load Text::CSV module for parsing CSV 
use LWP::Simple; #load LWP module for doing HTTP get 

my $file = 'sid_swap.csv'; #CSV file to parse and load 
my $csv = Text::CSV->new(); #create a new Text::CSV object 

open (CSV, "<", $file) or die $!; #open CSV file for parsing 

while (<CSV>) { 
    if ($csv->parse($_)) { 

     my @columns = $csv->fields(); #parse csv files and load into an array for each row 
     my $newSID = $columns[0]; 
     my $oldSID = $columns[1]; 
     system("sed -i 's/\<row SERVICE_MENU_ID=\"$oldSID\"/\n$newSID\|/g' customer_data.txt"); 

    } else { 
     my $err = $csv->error_input; 
     print "Failed to parse line: $err"; 
    } 
} 
close CSV; 

感谢您的帮助,您可以提供!

+0

通常,sed中在时间上的一个线路进行操作。通常,在命令行中使用sed时,通过使用反斜杠转义来添加换行符,然后逐字输入“_Enter_”键。不知道它如何在Perl中工作,但我会谷歌“_sed perl newline_”。在这种情况下,sed可能不是这项工作的正确工具。 – jahroy 2013-02-19 21:48:24

回答

4

要进行调试,请将system("sed ...")更改为die("sed ...");。你会看到你在做什么尝试执行

sed -i 's/<row SERVICE_MENU_ID="OLDSID"/ 
NEWSID|/g' customer_data.t 

我猜sed不喜欢它的争论中实际换行符?这可以通过适当的逃避来解决,但你的方法是......疯狂。您正在处理CSV的每一行的整个文件!

open(my $CSV, "<", $file) or die $!; # Let's not use global vars! 

my %fixes; 
while (<$CSV>) { 
    $csv->parse($_) 
     or die "Failed to parse line: ".$csv->error_input."\n"; 

    my ($newSID, $oldSID) = $csv->fields(); 
    $fixes{$oldSID} = $newSID; 
} 

my $pat = join "|", map quotemeta, keys(%fixes); 
my $re = qr/$pat/; 

{ 
    local @ARGV = 'customer_data.txt'; 
    local $^I = ''; # "perl -i" mode 
    while (<>) { 
     s/<row SERVICE_MENU_ID="($re)"/\n$fixes{$1}|/g; 
     print; 
    } 
} 

在一次通过这样做,也解决的

1111,2222 
2222,3333 

是相同的问题,因为

1111,3333 
2222,3333 
+0

@TLP,它是固定的。 – ikegami 2013-02-19 22:05:24

+0

非常感谢您的帮助!我倾向于循环运行,然后努力进行逻辑思考。我绝不是程序员,我赞赏这个例子和解释! – 2013-02-20 14:09:15