2015-05-08 11 views
5

Mam plik CSV 2 GB, w którym kolumna 1 zawiera czas w epoce, a druga kolumna zawiera 10000-wierszowy plik XML (w postaci pojedynczej linii).Ignoruj ​​"Niezamknięty token" w Perlu

Chcę iterować po każdej linii tego pliku CSV i zapisać drugą kolumnę XML do pliku własnego. Używam XPath, aby uzyskać nazwę klienta z pliku XML, dzięki czemu mogę nazwać ten plik na [CustomerName]-[time from Column 1].xml. Jednak niektóre pliki XML nie są poprawne XML i pojawia się błąd, który mówi Unclosed Token on Line .... Czy istnieje sposób, aby zignorować tę wiadomość i po prostu pomijać ten plik? Oto mój kod Perla:

my $file = '../FILENAME.csv'; 
open my $info, $file or die "Could not open $file: $!"; 
my $count = 0; 
$| = 1; 

while(my $line = <$info>) { 
    $count++; if($count == 1) {next;} #Ignore headers 
    $line =~ /(\d+),"(.*?)"$/; #Load time into $1, XML file into $2 
    my $time = $1; 
    my $report = $2; 
    $report =~ s/""/"/g; #Replace "" with " 
    my $xp = XML::XPath->new(xml => $report); 
    my $ext = $xp->getNodeText('/report/customer') . "-" . $time . ".xml"; #Generate filename with customer name and time 
    write_file($ext, $report); 
} 
close $info; 

Jestem również otwarty na sugestie, aby uczynić to bardziej efektywnym.

Odpowiedz

4

Możesz spróbować zamknąć niepokojące kody wewnątrz eval. Na przykład:

eval { 
    my $xp = XML::XPath->new(xml => $report); 
    my $ext = $xp->getNodeText('/report/customer') . "-" . $time . ".xml"; #Generate filename with customer name and time 
    write_file($ext, $report); 
}; 
if ([email protected]) { 
    printf "ERROR: [email protected]"; 
} 

Poniższy kod:

$count++; if($count == 1) {next;} #Ignore headers 
$line =~ /(\d+),"(.*?)"$/; #Load time into $1, XML file into $2 
my $time = $1; 
my $report = $2; 

może być skrócony do:

next if ++$count == 1; #Ignore headers 
my ($time, $report) = ($line =~ /(\d+),"(.*)"$/); # time, XML file 
+0

byłoby bardziej efektywne, aby umieścić 'write_file()' po tym if? Moje błędy zwykle pochodzą z obsługi XML, a nie z pisania plików. – Bijan

+1

To zależy tylko od tego, czy chcesz wywołać 'write_file', gdy wystąpi błąd w przetwarzaniu XML. Jeśli chcesz to zrobić, deklaracja '$ ext' będzie musiała wstawić przed' eval' z być może zainicjalizowanym na pusty ciąg. – tivn

+0

Masz rację. Usunąłem '$ @ 'z wydruku, ponieważ drukuje on ponad 40000 znaków, a komunikat o błędzie nie jest dla mnie ważny. Dzięki! – Bijan