2016-01-18 6 views
1

Я пытаюсь очистить некоторые неаккуратные поля адресов в csv.Perl regex эффективный способ сохранить соответствие подстроке?

start_of_lineA,="123456789",end_of_lineA 
start_of_lineB,="234560000",end_of_lineB 
start_of_lineC,34567,end_of_lineC 

, что я чищу до:

start_of_lineA,12345,end_of_lineA 
start_of_lineB,23456,end_of_lineB 
start_of_lineC,34567,end_of_lineC 

И некоторые элементы уличного адреса, содержащие запятые, которые я могу просто бросить:

start_of_lineD,"123 Foo St, #1",End_of_lineD 
start_of_lineE,"456 Bar Lane, suite A, B",End_of_lineE 

к:

start_of_lineD,"123 Foo St",End_of_lineD 
start_of_lineE,"456 Bar Lane",End_of_lineE 

До сих пор, что я придумал, :

chomp; 
    if($_ =~ m/="/) 
    { 
    $_ =~ s/="\d{5}\K\d*"//g; 
    $_ =~ s/="//g; 
    } 
    if($_ =~ m/"[^"|^,]+,[^"]*"/) 
    { 
    $_ =~ s/"[^"|^,]+\K,[^"]*"//g; 
    $_=~ s/"//g; 
    } 
    @line = split(/,/,$_); 
    etc. 

В то время как это работает, кажется, неэлегантно. Есть ли более чистый способ?

+0

[Текст :: CSV_XS] (http://p3rl.org/Text::CSV_XS)? – choroba

ответ

1

Ну, для начала:

$_ =~ 

Принимают обычно излишним.

В противном случае - использовать Text::CSV и разобрать его:

my $csv = Text::CSV -> new(); 
while (my $row = $csv -> getline ($filehandle)) { 
    $row -> [1] =~ s/=\"(\d+)\"/$1/; 
    $row -> [1] =~ s/,//g; 
    $csv -> print (\*STDOUT, $row); 
}