2010-07-18 3 views
2

J'utilise le code suivant pour analyser assez grand fichier xml (> 50GB):Comment voir le progrès lors de l'analyse de gros fichier XML avec XML :: Parser?

use XML::Parser; 

my $p = new XML::Parser(
    'Handlers' => { 
     'Start' => \&handle_start, 
     'End' => \&handle_end,    
     'Char' => \&handle_char, 
    } 
); 
$p->parsefile('source.xml'); 

... 

sub handle_start { 
    ... 
} 

Le problème est qu'il prend beaucoup de temps pour analyser, et je voudrais obtenir une sorte de barre de progression. Je préférerais un moyen qui ne nécessite pas d'abord l'analyse du fichier entier juste pour obtenir le nombre total - donc, par exemple, la position actuelle dans le fichier d'entrée serait parfaite, parce que je pouvais simplement vérifier au démarrage taille totale du fichier , puis dans handle_start(), vérifiez la position actuelle et imprimez-la.

Répondre

7

Vous recherchez probablement la méthode current_byte de l'objet analyseur, qui est documentée dans XML::Parser::Expat.

Ainsi, vous pouvez enregistrer la taille du fichier dans un monde avant de commencer l'analyse syntaxique:

my $file_size = -s $input_file; 

puis calculer votre progression dans le gestionnaire comme ceci:

sub handle_start { 
    my($parser, $element) = @_; 

    my $pos = $parser->current_byte; 
    printf("%-20s %5.1f%%\n", $element, $pos * 100/$file_size); 
} 
+0

Merci beaucoup. C'est exactement ce dont j'ai besoin. –