lire le contenu du fichier d une liste

lire le contenu du fichier d une liste - Perl - Programmation

Marsh Posté le 28-09-2007 à 10:41:59    

Bonjour , je voulais ouvrir une liste qui contient des fichiers
 foreach $fic (@liste_a_traiter){  
    open (ENTREE, "$fic" );        
que je fais print $fic il me donne le nom des fichiers que la liste_a_ traiter contient.
mais ce que je recherche c est de lire le contenu de chaque fichier de cette liste .
 est ce que vous pouvais m aider svp?
merci

Reply

Marsh Posté le 28-09-2007 à 10:41:59   

Reply

Marsh Posté le 28-09-2007 à 10:50:40    

Ben ta ligne open() t'a fourni un descripteur de fichier "ENTREE" qu'il te faut ensuite utiliser...
 
http://perldoc.perl.org/functions/open.html

Reply

Marsh Posté le 28-09-2007 à 11:00:47    

j ai fais ça et ça n a pas marché/
 foreach $fic (@liste_a_traiter){          
    open (ENTREE, "$fic" );                  
    print "$fic\n";                        
    while(<ENTREE> ){                        
  #        if ((/^(\$.ATA.*\.\w*\.\w*)/)){  
  #            print $_;                    
}
}

Reply

Marsh Posté le 28-09-2007 à 11:02:05    

Mince [:icon9]


Message édité par Elmoricq le 28-09-2007 à 11:02:27
Reply

Marsh Posté le 28-09-2007 à 11:03:12    

est ce que tu vois ou est le probleme?

Reply

Marsh Posté le 28-09-2007 à 11:07:14    

Qu'est ce qui "ne marche pas"?
rajoute un or die sur le open histoire de voir si tu n'as pas un probleme de lecture du fichier:

Code :
  1. open(ENTREE, $fic ) or die('pb: '.$!);
 

edit: es-tu sur que le probleme ne vient pas de la regex qui ne matcherait jamais?


Message édité par anapajari le 28-09-2007 à 11:08:35
Reply

Marsh Posté le 28-09-2007 à 11:10:38    

Tout le contenu de la boucle est commenté, donc effectivement, ça ne fait pas grand chose. [:dawa]

Reply

Marsh Posté le 28-09-2007 à 11:14:52    

j ai eu ce message :can't open RFPSTATC_2007-09-17.TXT: No such file or directory at D:\metrologie\o
per\tmp\fichiers_a_traiter.pl line 39, <Logfile> line 193.

Reply

Marsh Posté le 28-09-2007 à 11:19:09    

quand je l execute j 'enleve le commentaire

Reply

Marsh Posté le 28-09-2007 à 11:20:51    

lotffa a écrit :

j ai eu ce message :can't open RFPSTATC_2007-09-17.TXT: No such file or directory at D:\metrologie\o
per\tmp\fichiers_a_traiter.pl line 39, <Logfile> line 193.


Tu n'as pas vaguement l'impression d'essayer de lire un fichier qui n'est pas à l'endroit que tu lui indiques?
A l'instinct je dirais que ta liste ne contient que les noms de fichiers et qu'il manque le chemin vers ceux-ci.


Message édité par anapajari le 28-09-2007 à 11:21:02
Reply

Marsh Posté le 28-09-2007 à 11:20:51   

Reply

Marsh Posté le 28-09-2007 à 11:23:04    

si il les affiches si qu il connait le chemin .

Reply

Marsh Posté le 28-09-2007 à 11:25:24    

lotffa a écrit :

can't open RFPSTATC_2007-09-17.TXT: No such file or directory at D:\metrologie\o


lotffa a écrit :

si il les affiches si qu il connait le chemin .


cherchez l'erreur [:w3c compliant][:w3c compliant][:w3c compliant]
Il te dit que le fichier existe pas, c'est que le fichier existe pas !!!

 

Ce qu'il "affiche" c'est le nom du fichier ( qui doit vraisemblablement exister quelque part), mais si celui-ci n'est pas dans le même répertoire que ton script perl, ça ne peut pas marcher.

 

Peux tu montrer comment tu alimentes ton array @liste_a_traiter.

 


Message édité par anapajari le 28-09-2007 à 11:25:40
Reply

Marsh Posté le 28-09-2007 à 11:26:54    

voila tous le programme:
#!/usr/bin/perl                                                                                  
do '..\\cf\\metro.cfg';                                                                          
$volume="D:";                                                                                    
$logfile= "$OPER_LOG\\Logfile_traite_fupinfo.txt";                                              
open((Logfile, "$logfile" ));                                                                    
while($fichier = <Logfile> ){                                      
  if ($fichier=~ /(\w+\_\d{4}\-\d{2}\-\d{2}\.TXT)\sOK/){                          
   $fichier_traites=$1;                                                    
   #print $fichier_traites."\n";                                            
   $fichier_ok=uc($fichier_traites);                                        
   push (@loglist,$fichier_ok);                                            
   #print " ------>$fichier_ok\n";                                          
  }                                                                          
 }                                                                                        
#print "@loglist\n";                                                                            
my @fichiers_arriv=`dir /b $volume\\metrologie\\STATS_PROD\\r??stat?_????-??-??.txt`;            
#print "@fichiers_arriv\n";                                                                      
                                                                                                 
if (@fichiers_arriv){                                                                            
    for(@fichiers_arriv){                                                                        
     chop($_);                                                                                
     $fichier_traite=uc($_);                                                                  
      @fich_arriv=uc($_);                                                                    
      #print "@fich_arriv\n";                                                                
       foreach(@loglist){                                                                    
       if(/($fichier_traite)/){                                                        
           #print "$_\n";                                                              
           @fichier_trouves= $_;                                                        
           #print "fichiers trouves---->@fichier_trouves\n";                            
           $recupere=1;                                                                
           #print @loglist;                                                            
       }                                                                              
   }                                                                    
   my %h;                                                                                
   map { $h{$_} = 1 } @fichier_trouves;                                                  
   my @liste_a_traiter = grep { !$h{$_} } @fich_arriv;                                    
                                                                                         
   foreach $fic (@liste_a_traiter){                                                      
             open (ENTREE, "$fic" )   || die "can't open $fic: $!";                              
             print "$fic\n";                                                                    
                                                                                                 
              while(<ENTREE> ){                                                                  
           #        if ((/^(\$.ATA.*\.\w*\.\w*)/)){                                              
           #            print $_;                                                                
           #            $nom_objet = $1;                                                        
           #            $paragraphe_table = "debut";                                          
                     print 'ok';                                                              
           #                                                                                    
     # }                                                                                  
      }                                                                        
  }                                                                                
 }                                                                          
}                                                                                        
                                                                                                 

Reply

Marsh Posté le 28-09-2007 à 11:28:21    

Bon c'est illisible tel quel, j'espère que tu t'en rends compte.

 

Il y a des balises pour pouvoir mettre du code :

Code :
  1. #!/usr/bin/perl                                                                                  
  2. do '..\\cf\\metro.cfg';                                                                          
  3. $volume="D:";                                                                                    
  4. $logfile= "$OPER_LOG\\Logfile_traite_fupinfo.txt";                                              
  5. open((Logfile, "$logfile" ));                                                                    
  6. while($fichier = <Logfile> ){                                      
  7.  if ($fichier=~ /(\w+\_\d{4}\-\d{2}\-\d{2}\.TXT)\sOK/){                          
  8.   $fichier_traites=$1;                                                    
  9.   #print $fichier_traites."\n";                                            
  10.   $fichier_ok=uc($fichier_traites);                                        
  11.   push (@loglist,$fichier_ok);                                            
  12.   #print " ------>$fichier_ok\n";                                          
  13.  }                                                                          
  14. }                                                                                        
  15. #print "@loglist\n";                                                                            
  16. my @fichiers_arriv=`dir /b $volume\\metrologie\\STATS_PROD\\r??stat?_????-??-??.txt`;            
  17. #print "@fichiers_arriv\n";                                                                      
  18.                                                                                                
  19. if (@fichiers_arriv){                                                                            
  20.    for(@fichiers_arriv){                                                                        
  21.     chop($_);                                                                                
  22.     $fichier_traite=uc($_);                                                                  
  23.      @fich_arriv=uc($_);                                                                    
  24.      #print "@fich_arriv\n";                                                                
  25.       foreach(@loglist){                                                                    
  26.       if(/($fichier_traite)/){                                                        
  27.           #print "$_\n";                                                              
  28.           @fichier_trouves= $_;                                                        
  29.           #print "fichiers trouves---->@fichier_trouves\n";                            
  30.           $recupere=1;                                                                
  31.           #print @loglist;                                                            
  32.       }                                                                              
  33.   }                                                                    
  34.   my %h;                                                                                
  35.   map { $h{$_} = 1 } @fichier_trouves;                                                  
  36.   my @liste_a_traiter = grep { !$h{$_} } @fich_arriv;                                    
  37.                                                                                        
  38.   foreach $fic (@liste_a_traiter){                                                      
  39.             open (ENTREE, "$fic" )   || die "can't open $fic: $!";                              
  40.             print "$fic\n";                                                                    
  41.                                                                                                
  42.              while(<ENTREE> ){                                                                  
  43.           #        if ((/^(\$.ATA.*\.\w*\.\w*)/)){                                              
  44.           #            print $_;                                                                
  45.           #            $nom_objet = $1;                                                        
  46.           #            $paragraphe_table = "debut";                                          
  47.                     print 'ok';                                                              
  48.           #                                                                                    
  49.     # }                                                                                  
  50.      }                                                                        
  51.  }                                                                                
  52. }                                                                          
  53. }
 

edit : a y est, je l'ai parcouru. En diagonale. Anapajari, je te passe le relai, moi je vais juste lire [:klem3i1]


Message édité par Elmoricq le 28-09-2007 à 11:31:57
Reply

Marsh Posté le 28-09-2007 à 11:30:53    

bien ce que je disais :o
Ta liste est remplie à partir du résultat de

Code :
  1. my @fichiers_arriv=`dir /b $volume\\metrologie\\STATS_PROD\\r??stat?_????-??-??.txt`;


Tes fichiers sont donc dans le repertoire

$volume\\metrologie\\STATS_PROD\\


Quand tu fais le open, il faut le préciser:

Code :
  1. open (ENTREE, $volume."\\metrologie\\STATS_PROD\\".$fic )   || die "can't open $fic: $!";
 

edit: si j'ai le courage je parlerai du reste du code qui est une infamie

Message cité 1 fois
Message édité par anapajari le 28-09-2007 à 11:32:38
Reply

Marsh Posté le 28-09-2007 à 11:35:55    

ok merci beucoup

Reply

Marsh Posté le 28-09-2007 à 11:38:29    

anapajari a écrit :

edit: si j'ai le courage je parlerai du reste du code qui est une infamie


 
Je ne sais même pas par où commencer.
 
Lotffa > je te suggère de potasser le site http://perldoc.perl.org qui contient toute la documentation du langage. Il est très bien fait, clair et plutôt simple.
Il te manque manifestement beaucoup de notions (ceci dit sans moquerie ni second degré).

Reply

Marsh Posté le 28-09-2007 à 11:43:21    

le probleme est que ce site est en anglais pas en francais, je comprend pas beaucoup l anglais

Reply

Marsh Posté le 28-09-2007 à 11:50:35    

Tiens, je l'ai refait un peu plus proprement, je suis pas sur d'avoir bien conservé la logique "métier" de ton script mais comme il est presque incompréhensible c'est pas facile:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. #do '..\\cf\\metro.cfg';
  4. my $volume="D:";
  5. my $logfile= "LOG\\Logfile_traite_fupinfo.txt";
  6. my $fileDirPath = "$volume\\metrologie\\STATS_PROD\\";
  7. my %fichiers_deja_traites;
  8. open(Logfile, "$logfile" );
  9. while(<Logfile> ){
  10.   if (/(\w+\_\d{4}\-\d{2}\-\d{2}\.TXT)\sOK/){
  11.     $fichiers_deja_traites{uc($1)} = 1;
  12.   }
  13. }
  14. close(Logfile);
  15. opendir (DIR, $fileDirPath) or die "Can't open current dir: $!\n";
  16. my @fichiers_arrives = grep (/^r..stat._....-..-..\.txt$/ , readdir (DIR));
  17. closedir (DIR);
  18. my @liste_a_traiter = grep { !$fichiers_deja_traites{uc($_)} } @fichiers_arrives;
  19. foreach my $fic (@liste_a_traiter){
  20.   open (ENTREE, $fileDirPath.$fic )   || die "can't open $fic: $!";
  21.   while(<ENTREE> ){
  22.     if ((/^(\$.ATA.*\.\w*\.\w*)/)){
  23.       print $_;
  24.     }
  25.   }
  26. }


lotffa a écrit :

le probleme est que ce site est en anglais pas en francais, je comprend pas beaucoup l anglais


sans méchanceté, abandonne la programmation si tu n'arrives pas à lire une doc en anglais...

Reply

Marsh Posté le 28-09-2007 à 11:56:19    

merci

Reply

Sujets relatifs:

Leave a Replay

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