help programmation perl - Perl - Programmation
Marsh Posté le 27-06-2014 à 13:53:02
Bonjour, oui, je voudrais plus de déails, car c'est loin d'être clair pour le moment.
Une ou deux lignes du CSV et ce que vous voulez en faire serait pas mal non plus pour aider à avancer
A+,
Marsh Posté le 27-06-2014 à 14:19:20
Alors en fais j'ai un csv ou j'ai le retour des erreurs d'un programme.
dans ce csv, il y a le numéro d'erreur par exemple (1020) l'heure et la date de quand cela c'est produit et aussi le temps, le temps reste le même pour l'instant, c'est 600 seconde sois 10 minute.
Mtn ce que je veut faire c'est récuperer a l'aide d'un programme perl le temps de cet erreur pour calculer le taux d'indisponibilité du programme sois faire le calcule (10/525600)*100. ce qui me donnera le pourcentage .
mais le soucis c'est qu'en perl je galère encore Mdrr et justement je voulais de l'aide sur la programmation, me faudrais au mieux un programme exemple, avec juste les chemin a remplacer. A oui j'ai oublier de préciser, le pourcentage que je recoit a la fin, il faut qu'il sois écrit dans un autre csv oui il n'y a que dans une case la valeur en % Merci de votre aide
Marsh Posté le 27-06-2014 à 14:23:16
Comme je vous ai déja dit, donnez une ou deux lignes exemples de votre CSV source en détaillant le ou les champs utiles pour la suite.
Et donnez aussi une ligne exemple du CSV résultat que vous voulez obtenir.
A+,
Marsh Posté le 30-06-2014 à 08:49:20
Voici un exemple:
140627-0811;1025;erreur retour autoscript;600
140626-1348;1025;erreur retour autoscript;600
Voila sa c'est ce que je reçoit dans mon csv,
Mtn je veut récupérer le 600 qui représente les second.
pour arrivé a un résultat :
1025; ...% d'indisponibilité ( les 3 petit points est le résultat de 600/31536000*100 )
1025 est donc le numéro d'erreur et le pourcentage c'est le taux d'indisponibilité. Voila je vous ai tous dit Merci d'avance
Marsh Posté le 30-06-2014 à 12:16:05
Ceci devrait vous donner un bon point de départ:
Code : |
1) on lit le log ligne a ligne et on parse avec une expression régulière pour ne garder que les deux champs concernés de la ligne
2) on remplit un hash dont les clés sont les numéros d'erreur et les valeurs le temps cumulé pour chaque erreur
3) on écrit dans un fichier résultat chaque clé (donc numéro d'erreur) et valeur associée a la clé (donc temps cumulé pour le numéro d'erreur) modulo une formule appropriée
A+,
Marsh Posté le 30-06-2014 à 13:24:33
Merci votre code est compréhensible, il ma beaucoup aidé mais lorsque le fichier de résultat se crée malheureusement il n'y a rien d'écrit, mes chemin sont correcte mais il n'arrive pas a lire les lignes.
Questions:
Est ce obliger que le fichier d'ouverture sois un .txt et non pas un .csv ?
Est-ce que la ligne :
print $fh $_, "; ", $data{$_}*100/31536000, "% d'indisponibilite\n";
doit être complété par une valeur qui précise après quel ";" il doit lire ?
Merci d'avance,
Marsh Posté le 30-06-2014 à 15:05:32
>> Est ce obliger que le fichier d'ouverture sois un .txt et non pas un .csv ?
Non, ça peut être n'importe quoi. C'est juste un nom de fichier.
>> mes chemin sont correcte
Quels chemins? donnez les ici en exemple
>> il n'arrive pas a lire les lignes
?? vous avez un message d'erreur en console?
>> doit être complété par une valeur qui précise après quel ";" il doit lire ?
La ligne est avec un print $fh, c'est donc une ligne d'écriture (dans le fichier ouvert associé au handle $fh)
La lecture ligne a ligne est faite dans la boucle while (<$fh> ) { ... }
On lit ligne a ligne le fichier ouvert associé au handle $fh, on met le contenu de la ligne dans la variable implicite $_ et on exécute le bloc de code de la boucle.
Le match d'expression régulière /^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/ du test s’exécute par défaut sur la variable $_, donc sur la ligne lue.
A+,
Marsh Posté le 30-06-2014 à 15:28:49
Voici le code avec les chemin :
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my ($fh, %data);
open $fh, "<", 'C:\Admin\TUN\res\inftund_au3_ret.txt';
while (<$fh> ) {
if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
$data{$1} += $2;
}
}
close $fh;
open $fh, ">", 'C:\Admin\TUN\res\inftund_retour_dispo.txt';
foreach (sort(keys %data)) {
print $fh $_, ";", $data{$_}*100/31536000, "% d'indisponibilite\n";
}
close $fh;
- Dans la console il n'affiche pas d'erreur, seulement la pause que j'indique dans le .bat et ensuite le message "Appuyez sur une touche pour continuer..."
Le fichier se crée correctement mais rien n'est écrit.
Marsh Posté le 30-06-2014 à 17:01:12
C'est bien des lignes comme
140627-0811;1025;erreur retour autoscript;600
que vous avez dans le fichier source, avec ce nombre exact de champs? et sans blanc en début de ligne?
Parce que chez moi, l'expression régulière initiale matche cette ligne sans pb.
Au vu du symptôme, on dirait que l'expression régulière n'est matchée par aucune ligne (donc %data reste vide, et le code d'écriture ne fait que créer un fichier vide).
Pour vérifier , changez
my ($fh, %data);
par
my ($fh, %data);
my $cnt = 0;
et changez
if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
$data{$1} += $2;
}
par
if (/^\d+-\d+;(\d+);[^;]*;(\d+)\s*$/) {
$data{$1} += $2;
}
else {
++$cnt;
if ($cnt <= 10) {
print "Unmatched: $_\n";
}
}
Ça va écrire a la console les 10 premières lignes pas matchées par l'expression régulière (alors qu'elles devraient l'être)
L'expression régulière est:
^\d+-\d+;(\d+);[^;]*;(\d+)\s*$
^ début de ligne
\d+ des chiffres
- un tiret
\d+ des chiffres
; un point virgule
(\d+) des chiffres, qu'on stocke dans un premier groupe, $1
; un point virgule
[^;]* des caractères autres qu'un point virgule
; un point virgule
(\d+) des chiffres, qu'on stocke dans un premier groupe, $2
\s* des espaces éventuels
$ fin de ligne
S'il y a des espaces autour des champs, on peut utiliser l'expression
^\s*\d+-\d+\s*;\s*(\d+)\s*;[^;]*;\s*(\d+)\s*$
qui suppose qu'il peut y avoir des blancs en début de début et fin de ligne, ou autour des ; séparateurs de champs
A+,
Marsh Posté le 01-07-2014 à 08:38:35
Merci sa fonctionne, effectivement le %data crée un fichier vide cela etais le soucis.
Merci encore
Marsh Posté le 26-06-2014 à 15:23:59
Bonjour, Alors voila je programme en perl depuis peu, je suis loin de tous savoir, et j'ai besoin d'aide svp
Alors j'ai un .csv qui me retourne les erreurs avec le temps etc.. et je voudrais ecrire un perl qui me permettrait de chopper le temps du numéro d'erreur de mon csv, mais attention l'erreur (ex: 1020 ) doit dabord cumuler le tps total de sont erreur sur une année ( 525600 minute dans une année) et ensuite faire le calcule ( temps total de l'erreur * 100 divisé par le temps d'une année ) tous cela ecrit en perl et qui renvoie donc le pourcentage du temps de l'erreur dans un autre csv. je sais pas si j'ai bien expliquer mon soucis et ce que je recherche, donc si vous voulez plus de detail dite le moi :3
Merci d'avance