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

  FORUM HardWare.fr
  Programmation
  Perl

  lire le contenu du fichier d une liste

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lire le contenu du fichier d une liste

n°1616471
lotffa
Posté le 28-09-2007 à 10:41:59  profilanswer
 

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

mood
Publicité
Posté le 28-09-2007 à 10:41:59  profilanswer
 

n°1616473
Elmoricq
Modérateur
Posté le 28-09-2007 à 10:50:40  profilanswer
 

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

n°1616477
lotffa
Posté le 28-09-2007 à 11:00:47  profilanswer
 

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 $_;                    
}
}

n°1616478
Elmoricq
Modérateur
Posté le 28-09-2007 à 11:02:05  profilanswer
 

Mince [:icon9]


Message édité par Elmoricq le 28-09-2007 à 11:02:27
n°1616481
lotffa
Posté le 28-09-2007 à 11:03:12  profilanswer
 

est ce que tu vois ou est le probleme?

n°1616485
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-09-2007 à 11:07:14  profilanswer
 

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
n°1616488
Elmoricq
Modérateur
Posté le 28-09-2007 à 11:10:38  profilanswer
 

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

n°1616492
lotffa
Posté le 28-09-2007 à 11:14:52  profilanswer
 

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.

n°1616495
lotffa
Posté le 28-09-2007 à 11:19:09  profilanswer
 

quand je l execute j 'enleve le commentaire

n°1616496
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-09-2007 à 11:20:51  profilanswer
 

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
mood
Publicité
Posté le 28-09-2007 à 11:20:51  profilanswer
 

n°1616504
lotffa
Posté le 28-09-2007 à 11:23:04  profilanswer
 

si il les affiches si qu il connait le chemin .

n°1616507
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-09-2007 à 11:25:24  profilanswer
 

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
n°1616509
lotffa
Posté le 28-09-2007 à 11:26:54  profilanswer
 

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';                                                              
           #                                                                                    
     # }                                                                                  
      }                                                                        
  }                                                                                
 }                                                                          
}                                                                                        
                                                                                                 

n°1616510
Elmoricq
Modérateur
Posté le 28-09-2007 à 11:28:21  profilanswer
 

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
n°1616515
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-09-2007 à 11:30:53  profilanswer
 

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
n°1616523
lotffa
Posté le 28-09-2007 à 11:35:55  profilanswer
 

ok merci beucoup

n°1616526
Elmoricq
Modérateur
Posté le 28-09-2007 à 11:38:29  profilanswer
 

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é).

n°1616532
lotffa
Posté le 28-09-2007 à 11:43:21  profilanswer
 

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

n°1616535
anapajari
s/travail/glanding on hfr/gs;
Posté le 28-09-2007 à 11:50:35  profilanswer
 

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...

n°1616537
lotffa
Posté le 28-09-2007 à 11:56:19  profilanswer
 

merci


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

  lire le contenu du fichier d une liste

 

Sujets relatifs
Probleme de transfert de fichier via winsock appli Serveur/Clientscahier des charges choix CMS/gestionnaire contenu
lire les 10 premier Line du contenue d'un fichierFichier
partie de liste[Shell] commande sort pour fichier txt
Modele de quelque fichier source c++ please....compression d'un fichier
Ajouter image dans un fichier pdf existant 
Plus de sujets relatifs à : lire le contenu du fichier d une liste


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