Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
parser un fichier text
Envoyé par: vitcz

Bonjour a tous,

j'essaye de récupérer deux variables d'un fichier texte. Ce dernier comprend pour chaque ligne les informations suivantes : nom_user, nom_table, nom_champ, séparées par une virgule :

j'essay une syntaxte du type :

utilisateur=$ligne| cut -d -f 2
mdp=$ligne| cut -d -f 3

Mais elle ne me semble pas etre obtimum, j'aimerais que ma boucle puisse supporter les sauts de lignes et les commentaires.

merci d'avance pour vos idées.

Poste le Monday 4 August 2008 11:20:20
Répondre     Citer    
Re: parser un fichier text

Hum, as tu regardé du coté de awk ?

egrep -v '(^#|[\s]*\n)' | awk -F ',' '{print $1}'

En se penchant dans les arcanes de awk (man awk et info awk) tu dois pouvoir tout faire avec !

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Monday 4 August 2008 11:30:38
Répondre     Citer    
Re: parser un fichier text
Envoyé par: vitcz

Bonjour Vincent-Xavier,

Merci pour votre réponse, Je commence a éplucher le man awk, mais c'est tres large et assez puissant. je n'avais pas fini avec le epgrep...
J'ai effectuer le test suivant :

egrep -v '(^#|[\s]*\n)' monfichier.txt | awk -F ',' '{print $1}'

lequel fichier texte contient :

table1, polygone,
table2, point,
table3, autre,
table4, test,
table5, test,

Pourtant : en réponse j'ai

table3
table4
table5

Les deux premiers enregistrement ne sontpas pris en compte

Mon besoin est le suivant : Un boucle dois extraire de ce fichier le nom de la table ainsi que le type d'un champs particulier que mes utilisateurs auront renseigné pour d'une part une création de fichier a partir d'une table et d'autre part un déplacement.

de fichiers une fois ces derniers créer :

j'en arrive a cela :

#créer des fichier depuis la table a partir des enregistrement du fichier texte
egrep -v '^(#| *$)' liste.txt | while read line; do sde2shp -o init -l $table_bdd -f $line$1 -t $line$2 -a all -u $user -p $password ; fi; done

#exporte les fichiers crés a partir de la liste du fichier texte.
egrep -v '^(#| *$)' liste.txtt | while read line; do if [ -f "REP1/$line" ]; then mv "REP1/$line.$1" "REP2/$line.$1" ; fi; done

La deuxième boucle fonctionnait avec sans les argument .$1 et .$2.

Je pense que je n'attribue pas bien les variable : problème de parsing

Poste le Monday 4 August 2008 12:32:02
Répondre     Citer    
Re: parser un fichier text
Envoyé par: AlSim

Pour du traitement de texte un peu "avancé" comme ça, il faut se tourner soit vers awk comme te le conseille Vincent-Xavier, soit vers Perl. À toi de voir la syntaxe que tu préfères : celle d'awk est un peu particulière, et Perl utilise les expressions régulières qui ressemblent à :

$champ1 = $1 if m/([^#\n].+), /

[catwell.info]

Poste le Monday 4 August 2008 13:52:32
Répondre     Citer    
Re: parser un fichier text
Envoyé par: vitcz

merci, cela me fais avancer pour la déclaration de la variable, mais pour appeler la valeur dans le :

then mv "REP1/$line......
Je ne vois pas comment rédiger cette partie, je multiplie les tests de syntaxe.

Poste le Monday 4 August 2008 14:29:51
Répondre     Citer    
Re: parser un fichier text
Envoyé par: vitcz

RE-bonjour,

j'ai tester votre syntaxe, et lorsque je fais :

egrep -v '(^#|[\s]*\n)' monfichier.txt | awk -F ',' '{print $1 $2}'

Il ne m'affiche que les données correspondant à une valeure de $2... Comme s'il triait que la premiere valeure de $2 alphabetiquement...c'est tres interessant. J'ai consulter man hawk, mais il reste impreci dans les syntaxes complexe.

AUriez vous une idée pour afficher toutes les valeures svp ?

merci par avance.

Poste le Monday 4 August 2008 15:44:02
Répondre     Citer    
Re: parser un fichier text

La page de man de awk est assez pauvre, je te suggère de regarder la page d'info :
info awk

C'est en forgeant qu'on devient forgeron, et c'est en sciant que Léonard De Vinci !

Mon site perso

Poste le Monday 4 August 2008 16:06:39
Répondre     Citer    
Re: parser un fichier text

$ less testfile
# blablablabla
table1, polygone,

table2, point,


table3, autre,
table4, test,
table5, test,

$ egrep -vw "(^#|^)" testfile | awk -F "," '{ print $1 }'
table1
table2
table3
table4
table5

$ egrep -vw "(^#|^)" testfile | awk -F "," '{ print $1 $2}'
table1 polygone
table2 point
table3 autre
table4 test
table5 test
tada!

Poste le Monday 4 August 2008 17:51:35
Répondre     Citer    
Re: parser un fichier text

et tout en awk :
$ awk -F"," '$0 !~/^#/ {if (length($0)>1) {print $1 $2}}' testfile
table1 polygone
table2 point
table3 autre
table4 test
table5 test
tadada !

---
awk's aw[^]k[/^]esome!

Poste le Monday 4 August 2008 19:11:06
Répondre     Citer    
Re: parser un fichier text
Envoyé par: vitcz

Je m'en suis sorti avec un egrep :

egrep -v '^(#|*$|[\s]*\n)' liste.txt | awk -F ',' '{print $1 $2}'| while read line; do if ......

Mais là wooaw avec juste un Hawk c'est tres efficace. MErci beaucoup, je vais continuer a explorer les possibilités de Hawk, c'est tres puissant.

Poste le Tuesday 5 August 2008 14:48:57
Répondre     Citer    
Re: parser un fichier text

Et plus rapide...
time egrep -vw "(^#|^)" testfile | awk -F "," '{ print $1 $2}'
[...]
real    0m0.019s
user    0m0.008s
sys     0m0.008s

time awk -F"," '$0 !~/^#/ {if (length($0)>1) {print $1 $2}}' testfile
[...]
real    0m0.014s
user    0m0.000s
sys     0m0.004s
Ce doit être d'autant plus évident que les fichiers seront plus conséquents.

À lire : [[color=orange]The Grymoire[/color]]

Poste le Tuesday 5 August 2008 15:42:06
Répondre     Citer    
Re: parser un fichier text
Envoyé par: oudoubah

En awk, on peut simplifier la commande (histoire de point de vue purement subjectif):
awk -F ',' '/^[^\#]/ {print $1,$2}' fichier

on affiche les deux premiers champs de toute ligne qui a un premier caractère et qui est différent de #

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Thursday 7 August 2008 10:37:30
Répondre     Citer    
Re: parser un fichier text
Envoyé par: Nsd

et avec sed?..
cat fichier | while read line; do
eval $(echo "$line" | sed 's/^\ *\(.\+\),\(.\+\),\(.\+\)/user=\1; table=\2; champ=\3;/')
echo "user is $user, table is $table and champ is $champ"
done

Poste le Friday 8 August 2008 18:13:48
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
parser un fichier text
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons