Ouverture d'un fichier selon une partie de son nom

Ouverture d'un fichier selon une partie de son nom - Perl - Programmation

Marsh Posté le 18-03-2011 à 10:18:55    

Salut,

 

Pour commencer, je précise que je suis totalement débutant en PERL  :D

 

Pour le boulot, on m'a demandé d'écrire un petit script qui :

 

-> se connecte à un serveur et ouvre 2 fichiers selon la date du jour (fichiers de log créés chaque jour)
-> selon la taille du fichier, envoi d'un mail si c'est ok ou s'il y a des erreurs.

 

Les 2 fichiers que je dois analyser chaque jour se nomment par exemple :
- BatchPorterExport_error_11-03-18_244845.log
- BatchPorterExport_error_11-03-18_243214.log

 

J'ai déjà réussi à récupérer la date du jour + le mois + l'année de façon à ouvrir les logs mais je souhaite virer les 6 derniers chiffres qui correspondent à l'heure exacte du log.

 

Je bloque actuellement à l'ouverture du fichier. Pour le moment je souhaite juste ouvrir le fichier et écrire dedans pour voir si mon ouverture se passe bien :

 
Citation :

#!/usr/bin/perl

 

use strict;
use warnings;

 

my $filesize = -s "test.txt";
print "Size: $filesize\n";
if ($filesize > 136) {print "ATTENTION ERREURS DANS LE FICHIER TEST\n";}
else {print "PAS D'ERREUR\n";}

 

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

 

$year = $year - 100;
$mon = sprintf("%02d",$mon+1);
$mday = sprintf("%02d",$mday);

 

print "Nous sommes le : ".$mday." du mois ".$mon." de l'annee ".$year."\n";

 

open (FILE1, '>>',"BatchPorterExport_error_".$year."-".$mon."-".$mday."_*.log" ) || die("Probleme d'ouverture FILE1\n" );
print FILE1 ("Nous sommes le : ".$mday." du mois ".$mon." de l'ann←e ".$year."\n" );

 


Voilà ça bloque au niveau du ."_*.log". L'étoile doit servir à remplacer l'heure dans le nom de fichier pour ouvrir n'importe lequel de mes 2 fichiers de logs (je ferais une boucle pour cela) mais je ne vois pas comment m'y prendre......

 


Merci d'avance pour votre aide

 

A++


Message édité par little28 le 18-03-2011 à 10:20:04
Reply

Marsh Posté le 18-03-2011 à 10:18:55   

Reply

Marsh Posté le 18-03-2011 à 11:03:27    

Bon, en virant ton test initial pour prendre moins de place. Ce qui te manquait, c'est de connaitre l'usage de glob()

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my ($mday, $month, $year) = (localtime(time))[3..5];
  6. $month++;
  7. $year += 1900; # autant garder les bonne valeurs dans les variables
  8.  
  9. printf("Nous sommes le : %02d du mois %02d de l'annee %02d\n", $mday, $month, $year%1000);
  10.  
  11. my $dateformated = sprintf("%02d-%02d-%02d", $year%1000, $month, $mday); #date formatee, peut resservir
  12. my $logpattern = "BatchPorterExport_error_${dateformated}_*.log"; #pattern des fichiers a chercher
  13. my @loglist = glob($logpattern); # on en recupere le liste
  14.  
  15. foreach (@loglist) { on boucle sur la liste pour processer fichier a fichier
  16.  open(my $file1, '>>', $_) or die ("Probleme d'ouverture $_\n" );
  17.  sprintf($file1, "Nous sommes le : %02d du mois %02d de l'annee %02d\n", $mday, $month, $year%1000);
  18.  close($file1);
  19. }


 
On peut aussi l'écrire de manière plus compacte:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my ($mday, $month, $year) = (localtime(time))[3..5];
  6. $month++;
  7. $year += 1900; # autant garder les bonne valeurs dans les variables
  8.  
  9. printf("Nous sommes le : %02d du mois %02d de l'annee %02d\n", $mday, $month, $year%1000);
  10. my $dateformated = sprintf("%02d-%02d-%02d", $year%1000, $month, $mday);
  11.  
  12. foreach (glob("BatchPorterExport_error_${dateformated}_*.log" )) {
  13.  open(my $file1, '>>', $_) or die ("Probleme d'ouverture $_\n" );
  14.  sprintf($file1, "Nous sommes le : %02d du mois %02d de l'annee %02d\n", $mday, $month, $year%1000);
  15.  close($file1);
  16. }


 
Notes que glob() donne la liste des fichiers correspondant à un pattern dans le repertoire courant.
Il faut donc éventuellement faire un  
cd "le bon répertoire";
avant d'appeler glob(), selon l'endroit ou tu executes le script.
A+,


Message édité par gilou le 18-03-2011 à 14:50:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-04-2011 à 13:03:39    

Je n'avais pas vu ta réponse :o
 
Merci pour ton aide, je teste ça cette après midi au boulot  [:sqel]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed