utilisation d'un fichier d'initialisation

utilisation d'un fichier d'initialisation - Perl - Programmation

Marsh Posté le 09-03-2016 à 10:34:59    

Bonjour à tous,
 
Je souhaiterai utiliser un  fichier d'initialisation pour ne plus faire apparaître les arborescences dans mon programme.
Parce que le code que j'utilisais possédé les différentes arborescence et je souhaite m'en débarrasser :

Code :
  1. use strict;
  2. use warnings;
  3. sub GetFilesList
  4. {
  5.         my $Path = $_[0];
  6.         my $FileFound;
  7.         my @FilesList=();
  8.         ## Lecture de la liste des fichiers
  9.         opendir (my $FhRep, $Path)
  10.                 or die "Impossible d'ouvrir le repertoire $Path\n";
  11.         my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  12.         closedir ($FhRep);
  13.         foreach my $FileFound (@Contenu) {
  14.                 ## Traitement des fichiers
  15.                 if ( -f "$Path/$FileFound" ) {
  16.                         push ( @FilesList, "$Path/$FileFound" );
  17.                 }
  18.                 ## Traitement des repertoires
  19.                 elsif ( -d "$Path/$FileFound" ) {
  20.                         ## Boucle pour lancer la recherche en mode recursif
  21.                         push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  22.                 }
  23.         }
  24.         return @FilesList;
  25. }
  26. my @Files = GetFilesList ('C

    Spoiler :

    :/Users/baranowp/Documents/2016_01_07_08

    /facture/');

  27. foreach my $File  (@Files) {
  28. next unless $File =~ /\.txt$/i;
  29. print "$File \n";
  30. }
  31. @Files = GetFilesList ('C:/

    Spoiler :

    Users/baranowp/Documents/2016_02_04_05/

    bulletin_paie/');

  32. foreach my $File  (@Files) {
  33. next unless $File =~ /\.txt$/i;
  34. print "$File \n";
  35. }


Ce code m'affiche tout les fichiers de type txt se trouvant dans le répertoire facture et bulletin_paie.
 
Je souhaite utiliser un fichier d'initialisation pour remédier à ce problème.
 
Voici le contenu de ce fichier d'initialisation param.ini :
[repertoire]
REP_FACTURE=C:\

Spoiler :

Users\baranowp\Documents\2016_01_07_08

\facture\
REP_BULLETIN=C:\

Spoiler :

Users\baranowp\Documents\2016_02_04_05\

bulletin_paie\
 
Voici le code que j'utilise en ce moment :

Code :
  1. use strict;
  2. use warnings;
  3. my $Message_div = "";
  4. if ($ARGV[0] eq "" )
  5. {
  6. $Message_div="Erreur dans le nb argument(s) dans le fichier parametre .txt";
  7. }
  8. else
  9. {
  10. my $Fichier_ini = "$ARGV[0]";
  11. my $Path = "";
  12. my $FhRep = "";
  13. open (Fic_util_ini,"$Fichier_ini" );
  14. while (my $ln_ligne =<Fic_util_ini> )
  15. {
  16.  my $l1="";
  17.  my $l2="";
  18.  ($l1, $l2) = split('=',$ln_ligne, 2);
  19.  if ($l1 eq "REP_FACTURE" )
  20.  {
  21.   my $RepFacture=$l2;
  22.  }
  23.  if ($l2 eq "REP_BULLETIN" )
  24.  {
  25.   my $RepBulletin=$l2;
  26.  }
  27. }
  28. }
  29. close Fic_util_ini;


Je ne vois pas coment je peux utiliser la fonction GetFilesList dans mon programme, et je ne sais pas si mon programme fait appel à mon fichier d'initialisation.
 
J'espère que mes explications sont claires, si vous voulez plus d'informations n'hésiter pas.
 
Cordialement

Reply

Marsh Posté le 09-03-2016 à 10:34:59   

Reply

Marsh Posté le 09-03-2016 à 16:36:54    

Pourquoi faire ça à la main, alors qu'il y a déjà des modules pour cela:
Config::IniFiles, Config::Simple ou Config::Ini (ou d'autres)
Choisis celui le plus adapté à tes besoins.
 
Par exemple, avec Config::IniFiles  (je te déconseille Config::Simple, j'ai testé, et il est pas très pratique)
 
use Config::IniFiles;
......
my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
....
my $RepFacture  = $cfg->val('repertoire', 'REP_FACTURE');
my $RepBulletin = $cfg->val('repertoire', 'REP_BULLETIN');
 
A+,


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

Marsh Posté le 09-03-2016 à 16:40:42    

En faisant ce que tu me dis est ce qu'il va m'afficher tout les fichiers .txt qui se trouve dans le répertoire facture ?  
Idem pour le répertoire bulletin_paie ?
 
Je vais essayer ta méthode je te tiens au courant au plus vite.
 
Merci pour ton aide.

Reply

Marsh Posté le 09-03-2016 à 18:13:07    

Le code de gilou te sortira les chemins d'accèss de ton .ini, faudra ensuite appeler GetFilesList() avec (ou une fonction semblable).

Reply

Marsh Posté le 09-03-2016 à 22:29:46    

Oui, le code que je t'ai donné, c'est pour exploiter ton .ini
 
Pour le reste, tu pourrais utiliser ta fonction GetFileList, mais la encore, il y a un module (standard) pour cela (et bien plus): File::Find
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Config::IniFiles;
  5. use File::Find;
  6. use File::Spec;
  7.  
  8. my @directories_to_process;
  9. my @filelist;
  10.  
  11. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  12. foreach ('REP_FACTURE','REP_BULLETIN') {
  13.  push @directories_to_process, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  14. }
  15. find(\&wanted, @directories_to_process);
  16. sub wanted {
  17.  push @filelist, File::Spec->canonpath($File::Find::name) if (-f $_);
  18. }


find fait le parcours récursif et appelle wanted pour chaque repertoire ou fichier trouvé
si c'est un fichier ( if (-f $_)) on ajoute à la liste le nom avec son path absolu à la liste (push @filelist, $File::Find::name)
Mais comme find met les noms (relatifs) sous forme unix, on remet ça en forme avant avec canonpath.
 
A+,
 
 
 
 


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

Marsh Posté le 10-03-2016 à 09:53:00    

Bonjour,
 
Je viens d'instyaller Strawberry perl
 
lorsque j'exécute mon programme dans Powershell j'utilise la commande la suivante :
 
perl.exe C:\Users\baranowp\Documents\2016_03_07_11\param.pl C:\Users\baranowp\Documents\2016_03_07_11\param.ini
 
J'obtiens ce message d'erreur :
Can't locate Config/IniFiles.pm in @INC (you may need to install the Config::IniFiles module) (@INC contains: C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/Strawberry/perl/lib .) at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
BEGIN failed--compilation aborted at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
 
Et lorsque j'exécute mon programme depuis Geany j'obtiens :
' perl' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.

Reply

Marsh Posté le 10-03-2016 à 13:23:00    

Reply

Marsh Posté le 10-03-2016 à 14:10:09    

solerian a écrit :

Bonjour,
 
Je viens d'instyaller Strawberry perl
 
lorsque j'exécute mon programme dans Powershell j'utilise la commande la suivante :
 
perl.exe C:\Users\baranowp\Documents\2016_03_07_11\param.pl C:\Users\baranowp\Documents\2016_03_07_11\param.ini
 
J'obtiens ce message d'erreur :
Can't locate Config/IniFiles.pm in @INC (you may need to install the Config::IniFiles module) (@INC contains: C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/Strawberry/perl/lib .) at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
BEGIN failed--compilation aborted at C:\Users\baranowp\Documents\2016_03_07_11\param.pl line 3.
 
Et lorsque j'exécute mon programme depuis Geany j'obtiens :
' perl' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.

Ca te dit qu'il manque le module Config::IniFiles et qu'il faut l'installer.
 
L'article suivant: http://www.thegeekstuff.com/2008/0 [...] n-command/ dans sa seconde partie "Install Perl Modules using CPAN automatically" va vous expliquer très clairement la marche a suivre.
 
Bref vous installez cpan s'il n'est pas déjà installé, en suivant la procédure indiquée, puis vous faites
# cpan
....
cpan[1]> install "Config::IniFiles";
...
cpan[...]>quit
#
 
et ça devrait rouler (sauf erreur lors de l'installation du module par cpan, mais c'est relativement rare).
 
A+,


Message édité par gilou le 10-03-2016 à 14:12:44

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

Marsh Posté le 10-03-2016 à 14:25:08    

Je comprends mieux ma fonction GetFilesList mais j'ai quand même un message d'erreur que je ne comprend pas  
 
Voici mon code :
use strict;
use warnings;
use Config::IniFiles;
 
my @directories_to_process;
my @filelist;
my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
foreach ('REP_FACTURE','REP_BULLETIN') {
   push @directories_to_process, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
   }
 
sub GetFilesList  
{
        my $Path = $_[0];
        my $FileFound;
        my @FilesList=();
 
        ## Lecture de la liste des fichiers
        opendir (my $FhRep, $Path)
                or die "Impossible d'ouvrir le repertoire $Path\n";
        my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
        closedir ($FhRep);
 
        foreach my $FileFound (@Contenu) {
                ## Traitement des fichiers
                if ( -f "$Path/$FileFound" ) {
                        push ( @FilesList, "$Path/$FileFound" );
                }
                ## Traitement des repertoires
                elsif ( -d "$Path/$FileFound" ) {
                        ## Boucle pour lancer la recherche en mode recursif
                        push (@FilesList, GetFilesList("$Path/$FileFound" ) );
                }
        }
        return @FilesList;
}
my @Files = GetFilesList my $repfacture;
foreach my $File  (@Files) {  
 next unless $File =~ /\.txt$/i;
 print "$File \n";
}
 
@Files = GetFilesList my $repbulletin;
foreach my $File  (@Files) {  
 next unless $File =~ /\.txt$/i;
 print "$File \n";
}
Voici le message d'erreur :
Use of uninitialized value $Path in opendir at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 22.
Use of uninitialized value $Path in concatenation (.) or string at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 22.

Reply

Marsh Posté le 10-03-2016 à 14:50:14    

Tes appels de GetFilesList() ne sont pas bons. Le code de gilou sauvegarde les deux chemins d'accès dans @directories_to_process, donc soit tu utilises ça, soit tu adaptes le code.

 

Soit

Code :
  1. my @Files = GetFilesList($directories_to_process[0]);
  2. #....
  3.  
  4. @Files = GetFilesList($directories_to_process[1]);
  5. #...


soit

Code :
  1. #virer le foreach au début
  2.  
  3. my @Files = GetFilesList($cfg->val('repertoire', 'REP_FACTURE'))
  4. #...
  5.  
  6. @Files = GetFilesList($cfg->val('repertoire', 'REP_BULLETIN'))
  7. #...


(non testé)

 

edit: Balises ton code!


Message édité par rat de combat le 10-03-2016 à 14:51:37
Reply

Marsh Posté le 10-03-2016 à 14:50:14   

Reply

Marsh Posté le 10-03-2016 à 15:46:14    

Lorsque j'utilise ma commande perl.exe C:\Users\baranowp\Documents\2016_03_07_11\param.pl C:\Users\baranowp\Documents\2016_03_07_11\param.ini,
j'obtiens ce que je souhaite.
 
Maintenant il ne me reste plus qu'à traiter la seconde partie du fichier d'initialisation qui sont les fichiers paramètres
Contenu du fichier d'initialisation :  
[repertoire]
REP_FACTURE=C:\Users\baranowp\Documents\2016_01_07_08\facture\
REP_BULLETIN=C:\Users\baranowp\Documents\2016_02_04_05\bulletin_paie\
 
[param_facture]
PARAM_FACTURE=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.txt
PARAM_FACTURE_LOG=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.log
 
Voici le programme utilisé pour traiter le fichier d'initialisation :
 
Code :

Code :
  1. use strict;
  2. use warnings;
  3. use Config::IniFiles;
  4. my @directories_to_process;
  5. my @filelist;
  6. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  7. foreach ('REP_FACTURE','REP_BULLETIN') {
  8.   push @directories_to_process, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  9.   }
  10. foreach ('PARAM_FACTURE','PARAM_FACTURE_LOG') {
  11.   push @directories_to_process, $cfg->val('param_facture', $_) if $cfg->val('param_facture', $_);
  12.   }
  13. sub GetFilesList
  14. {
  15.         my $Path = $_[0];
  16.         my $FileFound;
  17.         my @FilesList=();
  18.         ## Lecture de la liste des fichiers
  19.         opendir (my $FhRep, $Path)
  20.                 or die "Impossible d'ouvrir le repertoire $Path\n";
  21.         my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
  22.         closedir ($FhRep);
  23.         foreach my $FileFound (@Contenu) {
  24.                 ## Traitement des fichiers
  25.                 if ( -f "$Path/$FileFound" ) {
  26.                         push ( @FilesList, "$Path/$FileFound" );
  27.                 }
  28.                 ## Traitement des repertoires
  29.                 elsif ( -d "$Path/$FileFound" ) {
  30.                         ## Boucle pour lancer la recherche en mode recursif
  31.                         push (@FilesList, GetFilesList("$Path/$FileFound" ) );
  32.                 }
  33.         }
  34.         return @FilesList;
  35. }
  36. my @Files = GetFilesList ($directories_to_process[0]);
  37. foreach my $File  (@Files) {
  38. next unless $File =~ /\.txt$/i;
  39. print "$File \n";
  40. }
  41. @Files = GetFilesList  ($directories_to_process[1]);
  42. foreach my $File  (@Files) {
  43. next unless $File =~ /\.txt$/i;
  44. print "$File \n";
  45. }
  46. my @tab = ();
  47. #my @tab1 = ();
  48. my $file =$directories_to_process[2]; ###param_facture.txt ###
  49. open(my $fic,$file) or die "$file: $!" ;
  50. my $param_facture = $directories_to_process[3]; ### param_facture.log###
  51. open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!";
  52. ## parcours les lignes du tableau
  53. print "facture : \n";
  54. foreach my $line(<$fic> ) {
  55.     chomp($line);
  56.     #print $line."\n";
  57. ## renvoi la position des valeurs qui  m'interesse 
  58.     @tab =split(";", $line);
  59.     print $tab [1]."\n";
  60.     print $tab [3]."\n";
  61.     print $tab [5]."\n";
  62.     print $tab [7]."\n";
  63. print "\n";
  64. #print $PARAM "$line\n";
  65. print $PARAM "$tab[1] $tab[3] $tab[5] $tab[7]\n";
  66. }   
  67. #close($fic);
  68. close ($PARAM);


Voici ce que m'affiche ce programme :  
La liste des différents fichiers contenu dans les répertoires factures et bulletin_paie et ce message d'erreur :
Use of uninitialized value $file in open at C:\users\baranowp\Documents\2016_03_07_11\param.pl line 55.
Use of uninitialized value $file in concatenation (.) or string at C:\users\baranowp\Documents\2016_03_07_11\param.pl line55.  
 

Reply

Marsh Posté le 10-03-2016 à 16:07:27    

Je suppose que le module a un problème à cause du désignateur(??) utilisé deux fois:

Citation :

[param_facture]
PARAM_FACTURE=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.txt
PARAM_FACTURE_LOG=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.log

 

Pour débugger tu peux rajouter genre print join("\n", @directories_to_process) après tes foreach (soit ligne 14 ou après).

 

Par contre ton code n'est pas très propre: @directories_to_process c'est des (noms de) dossiers, alors que ce que tu rajoutes dans ta deuxième boucle foreach c'est des (noms de) fichiers. Rien ne t'empêches de faire autrement, genre

Code :
  1. my $cfg = Config::IniFiles->new( -file => $ARGV[0] );
  2.  
  3. foreach ('REP_FACTURE','REP_BULLETIN') {
  4.  push @directories_to_process, $cfg->val('repertoire', $_) if $cfg->val('repertoire', $_);
  5. }
  6.  
  7. my $param_facture=$cfg->val('param_facture', 'PARAM_FACTURE'); #à revoir, cf mon message
  8. my $facture_log=$cfg->val('param_facture', 'PARAM_FACTURE_LOG');
  9.  
  10. #vérifications du contenu des deux variables?
  11. #...
  12.  
  13. open(my $fic, $param_facture) or die "$param_facture: $!";
  14. #....


(non testé)

 

Astuce: Tu peux te passer des vérifications sur open() si tu utilises (rajout au début) use Autodie;


Message édité par rat de combat le 10-03-2016 à 16:08:32
Reply

Marsh Posté le 10-03-2016 à 16:20:44    

C'est ce que j'ai fait j'ai modifié les variables de cette façon :

Code :
  1. my @parametre;
  2. foreach ('PARAM_FACTURE','PARAM_FACTURE_LOG') {
  3.   push @parametre, $cfg->val('param_facture', $_) if $cfg->val('param_facture', $_);
  4.   }
  5. y @tab = ();
  6. #my @tab1 = ();
  7. my $file =$parametre[0];
  8. open(my $fic,$file) or die "$file: $!" ;
  9. my $param_facture = $parametre[1];
  10. open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!";
  11. ## parcours les lignes du tableau
  12. print "facture : \n";
  13. foreach my $line(<$fic> ) {
  14.     chomp($line);
  15.     #print $line."\n";
  16.    
  17. ## renvoi la position des valeurs qui  m'interesse 
  18.     @tab =split(";", $line);
  19.     print $tab [1]."\n";
  20.     print $tab [3]."\n";
  21.     print $tab [5]."\n";
  22.     print $tab [7]."\n";
  23. print "\n";
  24. #print $PARAM "$line\n";
  25. print $PARAM "$tab[1] $tab[3] $tab[5] $tab[7]\n";
  26. }   
  27. #close($fic);
  28. close ($PARAM);

Reply

Marsh Posté le 10-03-2016 à 16:55:29    

et alors, ça fonctionne?

Reply

Marsh Posté le 10-03-2016 à 16:59:06    

oui ça fonctionne  :)  :lol:

Reply

Marsh Posté le 11-03-2016 à 16:17:52    

Je rencontre un petit soucis,  
Dans mon programme je ne veux plus voir apparaître d'arborescence de ce fait j'utilise le fichier d'initialisation comme vu précédement, Pour la focntion GetFilesList j'ai réussi à l'utiliser mais pour ce cas de figure je ne vois vraiment pas comment l'utiliser. Pour générer mon fichier de paramètre.log  
Comme ceci ça fonctionne mais je ne veux plus voir l'arborescence.
 

Code :
  1. use strict;
  2. use warnings;
  3. use Config::IniFiles;
  4. my @parametre;
  5. foreach ('PARAM_FACTURE','PARAM_FACTURE_LOG') {
  6.   push @parametre, $cfg->val('param_facture', $_) if $cfg->val('param_facture', $_);
  7.   }
  8. my @tab = ();
  9. #my @tab1 = ();
  10. my $file ="C:/Users/baranowp/Documents/2016_01_28_29/param_facture.txt";
  11. open(my $fic,$file) or die "$file: $!" ;
  12. my $param_facture = "C:/Users/baranowp/Documents/2016_01_28_29/param_facture.log";
  13. open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!";
  14. ## parcours les lignes du tableau
  15. print "facture : \n";
  16. foreach my $line(<$fic> ) {
  17.     chomp($line);
  18.     #print $line."\n";
  19. ## renvoi la position des valeurs qui  m'interesse 
  20.     @tab =split(";", $line);
  21.     print $tab [1]."\n";
  22.     print $tab [3]."\n";
  23.     print $tab [5]."\n";
  24.     print $tab [7]."\n";
  25. print "\n";
  26. #print $PARAM "$line\n";
  27. print $PARAM "$tab[1] $tab[3] $tab[5] $tab[7]\n";
  28. }   
  29. #close($fic);
  30. close ($PARAM);


 
Voici le fichier d'initialisation :
[param_facture]
PARAM_FACTURE=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.txt
PARAM_FACTURE_LOG=C:\Users\baranowp\Documents\2016_01_28_29\param_facture.log
 
Cordialement

Reply

Marsh Posté le 11-03-2016 à 16:37:16    

C'est moi qui a mal compris ou tu cherches simplement un truc genre

Code :
  1. #OU L'INVERSE!
  2. my $file=$parametre[0];
  3. my $param_facture=$parametre[1];

??
Dans ce cas autant virer le @parametre et la boucle qui va avec:

Code :
  1. #OU L'INVERSE!
  2. my $file=$cfg->val('param_facture', 'PARAM_FACTURE');
  3. my $param_facture=$cfg->val('param_facture', 'PARAM_FACTURE_LOG');

Reply

Marsh Posté le 11-03-2016 à 16:47:06    

oui je veux un truc comme ça  

Code :
  1. my $file ="C:/Users/baranowp/Documents/2016_01_28_29/param_facture.txt";
  2. open(my $fic,$file) or die "$file: $!" ;
  3. my $param_facture = "C:/Users/baranowp/Documents/2016_01_28_29/param_facture.log";
  4. open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!";


 
De ce fait j'obtiendrais ça :  
 

Code :
  1. my @parametre;
  2. foreach ('PARAM_FACTURE','PARAM_FACTURE_LOG') {
  3. push @parametre, $cfg->val('param_facture', $_) if $cfg->val('param_facture', $_);
  4. }
  5. my $file=$parametre[0];
  6. open(my $fic,$file) or die "$file: $!"
  7. my $param_facture=$parametre[1];
  8. open my $PARAM, ">", "$param_facture" or die "Ouverture impossible de $param_facture $!";


 

Reply

Sujets relatifs:

Leave a Replay

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