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.
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
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
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