Ho un file CSV da 2 GB dove la colonna 1 contiene il tempo in epoca e la seconda colonna contiene un file XML di linea 10000+ (come una singola riga).Ignora 'Token non chiuso' in Perl
Voglio ripetere tutte le righe di questo CSV e salvare la seconda colonna XML in un file a sé stante. Io uso anche XPath per ottenere il nome del cliente dal file XML in modo da poter denominare il file in [CustomerName]-[time from Column 1].xml
. Tuttavia alcuni dei file XML non sono XML validi e ricevo un errore che dice Unclosed Token on Line ...
. C'è un modo per ignorare quel messaggio e basta saltare il file? Quello che segue è il mio codice Perl:
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;
Sono aperto anche a suggerimenti per rendere questo più efficiente.
sarebbe più efficace per mettere 'write_file()', dopo che se dichiarazione? I miei errori di solito provengono dalla gestione XML, non dal file che scrive – Bijan
Dipende solo dal fatto che tu voglia o meno chiamare 'write_file' quando c'è un errore nell'elaborazione XML. Se si vuole fare questo, la dichiarazione di '$ ext' dovrebbe essere messa prima di' eval' con forse inizializzato per svuotare la stringa. – tivn
Hai ragione. Ho rimosso il '$ @' dalla stampa perché stampa più di 40000 caratteri per l'errore e il messaggio di errore non è importante per me. Grazie! – Bijan