recherche de valeur dans un fichier

recherche de valeur dans un fichier - Perl - Programmation

Marsh Posté le 25-10-2006 à 16:26:02    

salut,
 
Je ne sais pas si c'est possible donc je vous pose la question;
supposons que j'ai un fichier qui se presente ainsi
 

Citation :


#----------------------
#entreprise
#----------------------
 
var1 = client
var2 = produit
var3 = commande
 
#----------------------
#produit
#----------------------
 
p1 = reference
p2 = prix
p3 = quantite
 


 
est ce possible de recuperer la valeur de chaque variable ??
par exemple recuperer client,produit,commande...
et les mettre dans un autre fichier ou un tableau ?
 
Merci

Reply

Marsh Posté le 25-10-2006 à 16:26:02   

Reply

Marsh Posté le 25-10-2006 à 16:28:39    

bin t'as juste à lire ton fichier et faire un petit peu de parsing sur chacune des lignes... Donc oui c'est tout a fait faisable en perl, où es-tu bloqué?

Reply

Marsh Posté le 26-10-2006 à 08:45:50    

parsing ??
tu connaitrais le module perl a utiliser pour faire cela ?

Reply

Marsh Posté le 26-10-2006 à 08:50:50    

mais y'en a pas de particulier [:pingouino]
C'est tout ce qu'il y a de plus "standard" ce que tu cherches à faire et ça prend à peu près 2 lignes à ecrire ( dont une petite regex).

Reply

Marsh Posté le 26-10-2006 à 09:10:48    

ok
donc c'est avec les expression reguliere
je vais faire un petit google pour trouver de la doc sur les regex

Reply

Marsh Posté le 26-10-2006 à 10:11:06    

j'ai reussi à faire un code qui me permet de m'afficher si la variable est presente dans le fichier mais ce que je ne comprend pas trop
c'est comment lui dire de recuperer la valeur
je peux lui demander de chercher le "=" mais pour recuperer ce qu'il y a a droite du "=" ???je vois pas trop

Reply

Marsh Posté le 26-10-2006 à 10:12:45    

tu peux nous montrer ton code?

Reply

Marsh Posté le 26-10-2006 à 10:17:56    

Reply

Marsh Posté le 26-10-2006 à 10:18:54    


s'pas dit parce que si j'ai tout compris, il veut que les 'var' et pas les 'p' :o

Reply

Marsh Posté le 26-10-2006 à 10:20:20    

C'est pas incompatible. [:o_doc]

Reply

Marsh Posté le 26-10-2006 à 10:20:20   

Reply

Marsh Posté le 26-10-2006 à 10:25:09    

Code :
  1. #!/usr/bin/perl
  2. $infile = 'input.txt';
  3. @tabi = ("var1","var2","var3","p1","p2","p3" );
  4. open IN, $infile or die $!;
  5. while ($intext = <IN> ) {
  6. foreach $valeur (@tabi){
  7.    if ($intext =~ /$valeur/){
  8.    print  "valeur presente ".$valeur."\n";
  9.    }
  10.    }
  11. }
  12. close IN;


 
ce que je veux en faite c'est recuperer la valeur de mes variables (var1...p3)
par exemple pour var1 je veux recuperer client
comme sa je pourrai creer un tableau de ce genre
%nouvo ("var1" => "client"...

Reply

Marsh Posté le 26-10-2006 à 10:34:24    

Stocke directement dans un hâchage :
 

#! /usr/bin/perl
use strict;
 
my $infile = 'input.txt';
open IN, $infile or die $!;
 
my %resultat;
foreach my $intext ( <IN> )
{
    chomp($intext);
 
    # Explication : vérifie que
    # 1/ la ligne n'est pas un commentaire (n espaces + # en début de ligne)
    # 2/ la ligne n'est pas vide (ligne qui n'est composée que de n espaces)
    # 3/ la ligne contient un signe "="
    # (avec n entre 0 et ...)
    if ( $intext !~ m/^\s*#/ and $intext !~ m/^\s*$/ and $intext =~ m/=/ )
    {
        my ($clef, $valeur) = split /\s*=\s*/, $intext;
        $resultat{$clef} = $valeur;
    }
}
 
close IN;


 
Et voila, %resultat contient tous les couples clef => valeur pour les lignes qui ne sont pas des commentaires et contenant un séparateur "=".
 
edit : et une salutaire documentation  
=> types de données (pour savoir ce qu'est un hâchage et s'en servir) :  
http://perldoc.perl.org/perldata.html
=> les expressions régulières
http://perldoc.perl.org/perlre.html


Message édité par Elmoricq le 26-10-2006 à 10:42:26
Reply

Marsh Posté le 26-10-2006 à 10:45:39    

y'a une condition qui sert à rien :o

Code :
  1. if ( $intext !~ m/^\s*#/ and $intext !~ m/^\s*$/ and $intext =~ m/=/ )


si ça match la 3eme ça peut pas matcher la deuxieme :o
Et avec une seule regex on faisait tout en une ligne:

Code :
  1. foreach my $intext ( <IN> )
  2. {
  3.     chomp($intext);
  4.     $intext =~ /^\\s*(\\S+?)\\s*=\\s*(\\S+?)/;
  5.     $resultat{$1} = $2 if defined $1;
  6. }


:o :o
 
edit: backslashs sucrés par le forum


Message édité par anapajari le 26-10-2006 à 10:46:26
Reply

Marsh Posté le 26-10-2006 à 10:48:37    

Ta regexp ne prend pas en compte le cas des commentaires avec un signe "=" dedans. [:klem3i1]
 
Par contre oui, ma seconde regexp est parfaitement inutile. [:romf]

Reply

Marsh Posté le 26-10-2006 à 10:50:42    

ta raison pour les commentaires, du coup on rajoute une assertion:

Code :
  1. $intext =~ /^\\s*(?<!#)(\\S+?)\\s*=\\s*(\\S+?)/;

Reply

Marsh Posté le 26-10-2006 à 10:54:12    

Je préfère décomposer sur ce genre de cas, pour que ce soit plus lisible.
Mais bon "PERL : there is more than one way to do it", et c'est une chouette regexp. [:dawa]

Reply

Marsh Posté le 26-10-2006 à 10:54:33    

en faite voila, mon code  
je l'ai adapter par rapport à un script que j'ai vu sur le net:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my %values;
  5. my $infile = 'input.txt';
  6. open DATA, $infile or die $!;
  7. while (<DATA> ) {
  8.    chomp;
  9.    next if (/^\s*$/);
  10.    next if (/^\s*#/);
  11.    my ($name, $value) = split(/=/, $_);
  12.    $values{$name} = $value;
  13. }


 
il me recupere bien les variables ,avec les bonnes valeurs
mais le probleme
c'est que j'ai oublier de le preciser
est que devant mes variables j'ai un export

Citation :


 
export var1 = client  
export var2 = produit  
export var3 = commande  
 
#----------------------  
#produit  
#----------------------  
 
export p1 = reference  
export p2 = prix  
export p3 = quantite  
 
 


 
du coup dans mon tableau je me retrouve avec export+le nom de ma variable
arfffffffffff

Reply

Marsh Posté le 26-10-2006 à 10:56:10    

Eh bien à partir de ce qu'anapajari et moi-même avons mis, et avec la documentation sur les expressions régulières dont le lien figure dans l'un de mes messages, tu devrais très facilement pouvoir effacer ces "export" indésirables.
 
[:dawa]

Reply

Marsh Posté le 26-10-2006 à 11:20:59    

il fallait rajouter cela

Code :
  1. my ($name, $value) = split(/=/, $_);
  2.    $name =~ s/^\s*export\s+(\w+)/$1/;
  3.    $values{$name} = $value;


je me retrouve avec un script qui tourne
mais que je ne comprend pas et ça c'est chiant
j'ai trouver ce cours sur les expressions reguliere
[url] http://perso.univ-rennes1.fr/franc [...] node8.html [/url]
est ce que vous auriez des sites plus parlant

Reply

Marsh Posté le 26-10-2006 à 15:07:28    

j'en ai trouver un super sympa
http://perl.enstimac.fr/DocFr/perlretut.html
 
et si j'ai bien compris
sa signifie,tu  ignore les lignes qui commence 0 ou n espace du debut a la fin;mais on aurait pu mettre juste cela (/^$/);  

Citation :

next if (/^\s*$/);


 
sa signifie tu ignore les ligne qui commence par 0 ou n  espace et qui contienne ensuite un #

Citation :

next if (/^\s*#/);


 
sa signifie,si sa commence par 0 ou n espace, et qu'ensuite tu le mot export et qu'ensuite tu a 1 ou n espace et qu'ensuite tu a 1 ou plusieur lettre (j'ai un doute pour le w j'ai pas bien saisi si il correspond à un caractere alphanumerique donc une lettre ou à une chaine de caractere donc un mot ??), alors tu met dans $1 ce qu'il y a entre parenthese et on recupere $1 dans $name

Citation :

s/^\s*export\s+(\w+)/$1/;

Reply

Marsh Posté le 26-10-2006 à 15:20:18    

et si j'ai bien compris pour cette partie, si j'aurai un autre element mis entre parenthese apres (\w+) alors il correspondrait à $2 et ainsi de suite

Citation :

s/^\s*export\s+(\w+)/$1/;
 
 

Reply

Marsh Posté le 26-10-2006 à 15:39:27    

je viens de voir un truc dans le code

Citation :


next if (/^\s*#/);  


vu qu'il y a un # il ne prend pas en compte la fin de la ligne
comment cela se fait il que sa marche ?

Reply

Marsh Posté le 26-10-2006 à 15:42:21    

Juste pour remarque, la plupart des expressions régulières que tu expliques figurent dans le code que j'ai posté plus haut, avec l'explication. :o
 
Sinon pour ta dernière question, la regexp s'applique au début de la ligne, en gros elle signifie "si la ligne débute par un nombre indéterminé d'espaces, suivis d'un dièse, alors next".

Reply

Marsh Posté le 26-10-2006 à 16:23:43    

arf je n'avais pas vu  
si par exemple dans un autre fichier j'avais la description du tableau
our @montab =  
 ("var1" => "client2"...
 
est ce que sa aurait été possible de recuperer la valeur de la variable de mon fichier et de mettre a jour mon tableau avec cette variable ?
pour essayer de trouver la variable j'ai fait cela

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my $infile = 'output.txt';
  5. open DATA, $infile or die $!;
  6. while (<DATA> ) {
  7.    chomp;
  8.  
  9.    next if (/^\s*$/);
  10.    next if (/^\s*#/);
  11.    my ($name, $value) = split(/=>/, $_);
  12.    $name =~ s/^\s*\w+\s*=>\s+(\w+)/$1/;
  13.  
  14.    print $name."\n";
  15.  
  16. }


 
j'ai mis cela
=~ s/^\s*\w+\s*=>\s+(\w+)/$1/;
 
normalement sa devrai me recuperer
client2
mais la je n'ai que "var1"
et pourtant j'ai bien indiquer si sa commence par 0 ou n espace et qu'ensuite t'a du caractere et qu'ensuite t'a 0 ou plusieurs espace et qu'ensuite tu => ensuite 0 ou plusieur espace et ensuite tu recupere client2;

Message cité 1 fois
Message édité par donny3 le 26-10-2006 à 16:31:17
Reply

Marsh Posté le 26-10-2006 à 16:46:03    

$name =~ s/^\s*"\w+"\s*=>\s*"(\w+)"\s*/$1/;
 
je l'ai modifier comme ceci pour qu'il ne prenne pas les "
mais j'ai le meme resultat

Reply

Marsh Posté le 26-10-2006 à 17:10:30    

donny3 a écrit :

arf je n'avais pas vu  
si par exemple dans un autre fichier j'avais la description du tableau
our @montab =  
 ("var1" => "client2"...


 
Ca veut rien dire.
 
A partir de là, j'ai rien capté à tes questions.
 
Relis (voire "lis" [:mlc] ) les liens qu'anapajari et moi-même avons posté. Tout, et je dis bien tout, y est parfaitement expliqué.
 
On t'a également maché tout le travail avec du code qu'il te suffit de reprendre, et qu'apparemment tu ne lis pas non plus. On peut pas t'aider si tu ne lis pas les réponses.

Reply

Marsh Posté le 01-11-2006 à 16:40:06    

$ perl -e 'grep {/(\w+)\s*=\s*(\w+)/ and $val{$1} = $2} <>; map {print "$_ -> $val{$_}\n"} sort keys %val' txt
p1 -> reference
p2 -> prix
p3 -> quantite
var1 -> client
var2 -> produit
var3 -> commande


Message édité par matafan le 01-11-2006 à 16:43:12
Reply

Marsh Posté le 01-11-2006 à 16:42:24    

[:ummon]
 
PERL : There is more than one complicated way to do it. [:ddr555]


Message édité par Elmoricq le 01-11-2006 à 16:42:50
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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