Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1723 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu] Question sur l'optimisation pour compter le nombre de ligne

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Question sur l'optimisation pour compter le nombre de ligne

n°2104005
Sethenssen
Posté le 29-09-2011 à 20:03:56  profilanswer
 

Bonjour,
 
J'ai une question sur l'optimisation de mon script ci-dessous.
Il a pour but de parser un grand nombre de fichier comportant des milliers de ligne.
 
Il ne fait que compter si la ligne 6 est égal ou différent de 0
Puis si c'est vrai il m'envoi un mail de résultat, sinon un mail comme quoi il y a eu un souci.
 
Je veux juste savoir si pour les experts que vous êtes, si cette approche est la bonne ou bien existe t-il une solution plus propre et/ou plus simple pour effectuer ce comptage?
 

Code :
  1. opendir(DIR, $DIR) or die "Can't open $DIR: $!";
  2. my $SEARCH_FILE = "billing_$mday-$mon-$year";
  3.     @bil = grep(/$SEARCH_FILE/,readdir(DIR));
  4.     if (scalar @bil)    {
  5.         foreach my $ligne (@bil)    {
  6.             $i=0;
  7.             $y=0;
  8.             open (FILE, "<", $ligne);
  9.             while (my $line=<FILE> )    {
  10.                 $_ = $line;
  11.                 chomp $line;
  12.                 @tab=split(/;/,$line);
  13.                 if ($tab[5] == 0)    {
  14.                     $i = $i + 1;
  15.                 }
  16.                 elsif ($tab[5] != 0)    {
  17.                     $y = $y + 1;
  18.                 }
  19.             }
  20.             $Message = $Message . "$mday_hier/$mon_hier/$year_hier\t$y\t\t$i\n";
  21.             print "$mday_hier/$mon_hier/$year_hier;$y;$i\n";
  22.             close (FILE);
  23.         }
  24.         unlink join("\n", @bil), "\n";
  25.     }
  26.     # Vérification de la présence des données
  27.     if ($#bil == -1)    {    
  28.         print "\n$Err\n";
  29.         print "ERROR: NO FILES\n";
  30.         print "ERROR: __END__\n\n";
  31.         # send email
  32.         email_no_bil($To, $From, $Cc, $Bcc, $SubjectErr, $Message, $File);
  33.         exit;
  34.     }
  35.     closedir(DIR) or warn "Can't close $DIR: $!";


Message édité par Sethenssen le 30-09-2011 à 02:45:23
mood
Publicité
Posté le 29-09-2011 à 20:03:56  profilanswer
 

n°2104053
gilou
Modérateur
Modzilla
Posté le 30-09-2011 à 01:45:06  profilanswer
 

Citation :

Il ne fait que compter si la ligne 6 est égal ou différent de 0

Non. Pour chaque ligne, il regarde si le 6e champ vaut 0

 

J'ai pas testé, mais je ferais ainsi:

Code :
  1. my $SEARCH_FILE = "billing_$mday-$mon-$year";
  2. opendir(DIR, $DIR) or die "Can't open $DIR: $!";
  3. my @bil = grep /$SEARCH_FILE/ readdir(DIR);
  4. closedir(DIR) or warn "Can't close $DIR: $!";
  5.  
  6. if (@bil > 0)  {
  7.  foreach my $file (@bil)    {
  8.    my ($i, $y) = (0, 0);
  9.    open (FILE, "<", $file);
  10.    while (<FILE> )  {
  11.      # chomp;  # mis en commentaire car probablement inutile
  12.      (split(/;/, $_))[5]?++$y:++$i;
  13.    }
  14.    close (FILE);
  15.    $Message = $Message . "$mday_hier/$mon_hier/$year_hier\t$y\t\t$i\n";
  16.    print "$mday_hier/$mon_hier/$year_hier;$y;$i\n";
  17.  }
  18.  unlink join("\n", @bil), "\n"; # Je sais pas ce que vous voulez faire, mais c'est surement pas ça
  19.  # si c'est pour supprimer les fichiers, un simple unlink @bil; suffit
  20. }
  21. else {
  22.  print "\n$Err\n";
  23.  print "ERROR: NO FILES\n";
  24.  print "ERROR: __END__\n\n";
  25.  # send email
  26.  email_no_bil($To, $From, $Cc, $Bcc, $SubjectErr, $Message, $File);
  27.  exit;
  28. }
 

my $SEARCH_FILE = "billing_$mday-$mon-$year";
opendir(DIR, $DIR) or die "Can't open $DIR: $!";
my @bil = grep /$SEARCH_FILE/ readdir(DIR);
closedir(DIR) or warn "Can't close $DIR: $!";


On ouvre le directory le plus tard possible, et on le ferme le plus tôt possible.

 

if (@bil > 0)
ça teste si l'array a des éléments ou non, et c'est lisible.
et on fait un else pour quand il n'y en a pas au lieu de faire if ($#bil == -1) ce qui est dangereux

 

   while (<FILE> )  {
      # chomp;  # mis en commentaire car probablement inutile
      (split(/;/, $_))[5]?++$y:++$i;
    }


on va pas faire de (my $line = <FILE> ) et ensuite $_ = $line, car ça fait faire une copie complète de ligne à chaque fois (et en plus $_ n'est pas utilisé dans votre code)
On va juste faire (<FILE> ) et on aura donc chaque ligne directement dans $_
(split(/;/, $_))[5]?++$y:++$i;
On teste le 6e champ de la ligne, (split(/;/, $_))[5], obtenu donc en splittant la ligne sur ;  et donc en évitant une coûteuse recopie dans un array
Si ce 6e champ est non nul, on incrémente $y, sinon, on incrémente $i.
C'est l'opérateur A?B:C  qu'on retrouve dans tous les langages modernes, depuis le C.

 

Ça devrait accélérer le script.

 

NOTE: avec le test (split(/;/, $_))[5] si on a un 6e champ vide ;; ou bien absent (moins de 6 champs) il compte comme s'il valait 0.
Par contre un 6e champ avec 00 ou 0.0 compte comme s'il ne vaut pas 0
On peut se modifier le test en fonction du comportement voulu pour ces cas limites.

 

A+,


Message édité par gilou le 30-09-2011 à 01:46:54

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2104054
Sethenssen
Posté le 30-09-2011 à 02:22:58  profilanswer
 

waouh, ça c'est de l'explication
Merci Gilou,
 
Le (split(/;/, $_))[5]?++$y:++$i; est assez puissant, je ne connaissais pas. Je vais bosser sur ça.
 
Le my ($i, $y) = (0, 0); est sympas aussi, tellement simple qu'on y pense pas.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [Résolu] Question sur l'optimisation pour compter le nombre de ligne

 

Sujets relatifs
rollover sur toute une ligne et toute une colonne avec jquery[AIDE] Mise en ligne site web JAVA-JSP
question d'héritage et polymorphismeCompter le nbre #N/A sur plusieurs Feuilles
optimisation: affichage de photos : readdir ou requete sql ?Visual Basic : Rechercher la combinaison d'un nombre
Question Bases de données des banquesQuestion de modélisation
Convertisseur html vers PDF en ligne de commande[Résolu] Programmation d'un jeu en ligne en flash
Plus de sujets relatifs à : [Résolu] Question sur l'optimisation pour compter le nombre de ligne


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR