2013-02-19 64 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