0

私は、顧客サービス情報を取得してサービス ID を変更する perl スクリプトに取り組んでいます。私が今持っているコードは、参照用に2列のcsvファイルを取り、数字を交換できますが、「\ n」または「\ |」を使用しようとすると 私が必要とするように、それは私に「オール:

「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;

ご協力いただきありがとうございます。

4

1 に答える 1

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
于 2013-02-19T21:58:16.917 に答える