Question sur l'optimisation pour compter le nombre de ligne [Résolu] - Perl - Programmation
Marsh Posté le 30-09-2011 à 01:45:06
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 :
|
my $SEARCH_FILE = "billing_$mday-$mon-$year"; |
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> ) { |
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+,
Marsh Posté le 30-09-2011 à 02:22:58
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.
Marsh Posté le 29-09-2011 à 20:03:56
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?
Message édité par Sethenssen le 30-09-2011 à 02:45:23