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

  FORUM HardWare.fr
  Programmation
  Perl

  recherche de valeur dans un fichier

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

recherche de valeur dans un fichier

n°1464894
donny3
Posté le 25-10-2006 à 16:26:02  profilanswer
 

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

mood
Publicité
Posté le 25-10-2006 à 16:26:02  profilanswer
 

n°1464897
anapajari
s/travail/glanding on hfr/gs;
Posté le 25-10-2006 à 16:28:39  profilanswer
 

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é?

n°1465166
donny3
Posté le 26-10-2006 à 08:45:50  profilanswer
 

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

n°1465169
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 08:50:50  profilanswer
 

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

n°1465172
donny3
Posté le 26-10-2006 à 09:10:48  profilanswer
 

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

n°1465230
donny3
Posté le 26-10-2006 à 10:11:06  profilanswer
 

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

n°1465233
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 10:12:45  profilanswer
 

tu peux nous montrer ton code?

n°1465235
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:17:56  profilanswer
 
n°1465240
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 10:18:54  profilanswer
 


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

n°1465244
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:20:20  profilanswer
 

C'est pas incompatible. [:o_doc]

mood
Publicité
Posté le 26-10-2006 à 10:20:20  profilanswer
 

n°1465253
donny3
Posté le 26-10-2006 à 10:25:09  profilanswer
 

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

n°1465264
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:34:24  profilanswer
 

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
n°1465288
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 10:45:39  profilanswer
 

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
n°1465292
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:48:37  profilanswer
 

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]

n°1465293
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 10:50:42  profilanswer
 

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

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

n°1465296
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:54:12  profilanswer
 

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]

n°1465298
donny3
Posté le 26-10-2006 à 10:54:33  profilanswer
 

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

n°1465300
Elmoricq
Modérateur
Posté le 26-10-2006 à 10:56:10  profilanswer
 

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]

n°1465330
donny3
Posté le 26-10-2006 à 11:20:59  profilanswer
 

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

n°1465348
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-10-2006 à 11:39:14  profilanswer
 
n°1465483
donny3
Posté le 26-10-2006 à 15:07:28  profilanswer
 

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/;

n°1465490
donny3
Posté le 26-10-2006 à 15:20:18  profilanswer
 

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/;
 
 

n°1465512
donny3
Posté le 26-10-2006 à 15:39:27  profilanswer
 

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 ?

n°1465515
Elmoricq
Modérateur
Posté le 26-10-2006 à 15:42:21  profilanswer
 

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

n°1465550
donny3
Posté le 26-10-2006 à 16:23:43  profilanswer
 

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
n°1465568
donny3
Posté le 26-10-2006 à 16:46:03  profilanswer
 

$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

n°1465587
Elmoricq
Modérateur
Posté le 26-10-2006 à 17:10:30  profilanswer
 

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.

n°1468733
matafan
Posté le 01-11-2006 à 16:40:06  profilanswer
 

$ 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
n°1468734
Elmoricq
Modérateur
Posté le 01-11-2006 à 16:42:24  profilanswer
 

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


Message édité par Elmoricq le 01-11-2006 à 16:42:50
mood
Publicité
Posté le   profilanswer
 


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

  recherche de valeur dans un fichier

 

Sujets relatifs
tester la valeur d'une variable saisi[RSS] fichier XML ok mais faut-il obligatoirement le parser avec PHP?
[Resolu] [C Linux] poser un verrou sur un fichier[Résolu] Récupération automatique de fichier sur Internet
Valeur d'une fonctionTransfert de fichier qui bloque
[VBA] utiliser la valeur affichée d'une celluleRecherche multiple dans Excel
Copie automatique d'une macro prééxistante à la création d'un fichierrecherche comment faire un pacman en C
Plus de sujets relatifs à : recherche de valeur dans un fichier


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