recherche de valeur dans un fichier - Perl - Programmation
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é?
Marsh Posté le 26-10-2006 à 08:45:50
parsing ??
tu connaitrais le module perl a utiliser pour faire cela ?
Marsh Posté le 26-10-2006 à 08:50:50
mais y'en a pas de particulier
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).
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
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
Marsh Posté le 26-10-2006 à 10:17:56
ReplyMarsh Posté le 26-10-2006 à 10:18:54
Elmoricq a écrit : J'utiliserais split plutôt : |
s'pas dit parce que si j'ai tout compris, il veut que les 'var' et pas les 'p'
Marsh Posté le 26-10-2006 à 10:25:09
Code :
|
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"...
Marsh Posté le 26-10-2006 à 10:34:24
Stocke directement dans un hâchage :
#! /usr/bin/perl |
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
Marsh Posté le 26-10-2006 à 10:45:39
y'a une condition qui sert à rien
Code :
|
si ça match la 3eme ça peut pas matcher la deuxieme
Et avec une seule regex on faisait tout en une ligne:
Code :
|
edit: backslashs sucrés par le forum
Marsh Posté le 26-10-2006 à 10:48:37
Ta regexp ne prend pas en compte le cas des commentaires avec un signe "=" dedans.
Par contre oui, ma seconde regexp est parfaitement inutile.
Marsh Posté le 26-10-2006 à 10:50:42
ta raison pour les commentaires, du coup on rajoute une assertion:
Code :
|
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.
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 :
|
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 : |
du coup dans mon tableau je me retrouve avec export+le nom de ma variable
arfffffffffff
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.
Marsh Posté le 26-10-2006 à 11:20:59
il fallait rajouter cela
Code :
|
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
Marsh Posté le 26-10-2006 à 11:39:14
http://www.perl.com/doc/manual/html/pod/perlre.html
http://www.ilovejackdaniels.com/re [...] _sheet.pdf
http://www.regular-expression.info/
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/; |
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/; |
Marsh Posté le 26-10-2006 à 15:39:27
je viens de voir un truc dans le code
Citation : |
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 ?
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.
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".
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 :
|
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;
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
Marsh Posté le 26-10-2006 à 17:10:30
donny3 a écrit : arf je n'avais pas vu |
Ca veut rien dire.
A partir de là, j'ai rien capté à tes questions.
Relis (voire "lis" ) 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.
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 |
Marsh Posté le 01-11-2006 à 16:42:24
PERL : There is more than one complicated way to do it.
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
#----------------------
#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