2015-05-08 4 views
5

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.

risposta

4

È possibile provare a racchiudere i codici problematici all'interno di eval. Per esempio:

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]"; 
} 

Il seguente codice:

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

può essere abbreviato a:

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

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

+1

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

+0

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