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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] lecture d'un fichier txt ligne par ligne

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Shell] lecture d'un fichier txt ligne par ligne

n°1213424
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 11:27:22  profilanswer
 

Bonjour,
apres avoir chercher sur le forum et sur gooooooooooogle comment lire et récuperer ligne par ligne les infos contenues dans un fichier texte, je me suis décidé à poster ma question sur le forum. EN espérant quelqu'un a dejà fait un truc dans le genre pour me filer un coup de main.
je sais qu'il faut utiliser un  boucle for ou while pas je bloque quand à la lecture ligne par ligne.
Merci d'avance


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
mood
Publicité
Posté le 03-10-2005 à 11:27:22  profilanswer
 

n°1213428
Elmoricq
Modérateur
Posté le 03-10-2005 à 11:32:02  profilanswer
 
n°1213434
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 11:36:26  profilanswer
 


 
Je connais pas awk, c plus simple avec awk de faire ce que je veux faire??
 
Sinon ce n'est pas la peine j'ai trouvé comment faire
en combinant une boucle while et la commande cat et read
merci


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
n°1213443
Elmoricq
Modérateur
Posté le 03-10-2005 à 11:41:00  profilanswer
 

Ben awk est fait pour ça, à la base. [:elmoricq]
 
Parce que le souci du while + cat | read, c'est que si tes lignes contiennent des espaces, ta ligne sera vue comme une succession de champs.

n°1213446
sircam
I Like Trains
Posté le 03-10-2005 à 11:41:47  profilanswer
 

axk47 a écrit :

Je connais pas awk, c plus simple avec awk de faire ce que je veux faire??


Déroutant au début, mais la boucle de lecture du fichier est implicite -> excessivement puissant.
 

axk47 a écrit :

Sinon ce n'est pas la peine j'ai trouvé comment faire
en combinant une boucle while et la commande cat et read
merci


Ne poste surtout pas ta solution ici. :o
 
Comme ça, si qqn cherche à faire la même chose, il n'aura aucune chance de trouver la solution sur ce forum. Il reposera sans doute la même question que toi. S'il agit de la même manière, sans donner sa solution, c'est reparti pour un tour.
 
Et n'indique pas "résolu" dans le titre.
 
Et qui perd son temps dans tout ça ? Les bonnes poires qui veulent filer un coup de main sur ce forum.
 
Après quoi, on dira encore que les habitués sont désagréables.  :pfff:
 
Merci pour ta "collaboration" et ton "entraide", comme disent ceux qui viennent pomper ici sans jamais donner en retour.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1213586
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 14:16:04  profilanswer
 

sircam a écrit :

Déroutant au début, mais la boucle de lecture du fichier est implicite -> excessivement puissant.
 
 
Ne poste surtout pas ta solution ici. :o
 
Comme ça, si qqn cherche à faire la même chose, il n'aura aucune chance de trouver la solution sur ce forum. Il reposera sans doute la même question que toi. S'il agit de la même manière, sans donner sa solution, c'est reparti pour un tour.
 
Et n'indique pas "résolu" dans le titre.
 
Et qui perd son temps dans tout ça ? Les bonnes poires qui veulent filer un coup de main sur ce forum.
 
Après quoi, on dira encore que les habitués sont désagréables.  :pfff:
 
Merci pour ta "collaboration" et ton "entraide", comme disent ceux qui viennent pomper ici sans jamais donner en retour.


 
 
je pense que la philosophie du forum était de ne pas pondre du code pour ceux qui cherchent.
En meme temps j'ai donné implicitement la solution dans ma réponse mais comme tu insistes je vais cracher le code tout fait.
 
  *  Traiter séquentiellement une à une les lignes d'un fichier  
 
  Première solution
 
    * Définition de la fonction readline
    * readline file i écrit la ligne i du fichier file

Code :
  1. readline () {
  2.   fichier=$1
  3.   ligne=$2
  4.   head -$ligne $file | tail +1
  5. }


    * Utilisation pour traiter un fichier ($file) ligne par ligne

Code :
  1. nlignes=`wc -l < $file`
  2. i=1
  3. while test $i -le $nlignes
  4. do
  5.   laligne=`readline $file $i`
  6.   # traitement de la ligne
  7.   ...
  8.   i=`expr $i + 1`
  9. done


 
  La bonne méthode celle que j'ai prise
 
    * Utilisation d'une boucle while associée à read

Code :
  1. cat $file | while read laligne
  2. do
  3.    # traitement de la ligne
  4.    ...
  5. done


      ou

Code :
  1. while read laligne
  2. do
  3.    # traitement de la ligne
  4.    ...
  5. done < $file


 
Je ne suis du genre ingrat qui aime recevoir sans donner:  :??:  
 


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
n°1213594
Elmoricq
Modérateur
Posté le 03-10-2005 à 14:19:46  profilanswer
 

Comme je te disais, à priori s'il y a des espaces dans ta ligne, le while bouclera autant de fois qu'il y a d'espaces (recherche des séparateurs espace, tab et saut de ligne, et pas uniquement du saut de ligne).

n°1213604
sircam
I Like Trains
Posté le 03-10-2005 à 14:23:20  profilanswer
 

Citation :

je pense que la philosophie du forum était de ne pas pondre du code pour ceux qui cherchent.


OK, on est parti sur une mauvaise base. :jap:
 
Oui, c'est curieux, on ne donne pas de réponse toute faite à celui qui demande sur ce forum, mais quand la solution est discutée et trouvée sur un topic, elle est fatalement utilisable telle quelle par le suivant.
 
C'est paradoxal, mais en apparence seulement : bcp de questions ne sont que ponctuelles plutôt que générales, et ne pourront servir de réponse toute faite au prochain, qui pourra par contre s'en inspirer.
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1213607
sircam
I Like Trains
Posté le 03-10-2005 à 14:25:09  profilanswer
 

Je ne sais pas si ce 'wc' est des plus efficaces... Et ce 'head' comme readline, oula. :ouch:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1213615
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 14:31:01  profilanswer
 

sircam a écrit :

Je ne sais pas si ce 'wc' est des plus efficaces... Et ce 'head' comme readline, oula. :ouch:


 
 
les deux dernieres sont hyper efficcaces quelque soit la taille de ton fichier: ;)  :sol:  


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
mood
Publicité
Posté le 03-10-2005 à 14:31:01  profilanswer
 

n°1213623
sircam
I Like Trains
Posté le 03-10-2005 à 14:35:36  profilanswer
 

Enfin avec (g)awk, c'est tellement plus simple... Tout ça se réduit à quoi, une ligne ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°1213655
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 14:57:40  profilanswer
 

sircam a écrit :

Enfin avec (g)awk, c'est tellement plus simple... Tout ça se réduit à quoi, une ligne ?


je suis en train de jeter un coup d'oeil sur gawk pour comprendre comment ça marche
donc si tu pouvais me filer un coup de main ce serait gentil de ta part.
Merci


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
n°1213809
axk47
Java Man vs Boolet Man
Posté le 03-10-2005 à 17:22:43  profilanswer
 

sircam a écrit :

Enfin avec (g)awk, c'est tellement plus simple... Tout ça se réduit à quoi, une ligne ?


 
 ça y est j'ai trouvé  ;)  
voici la réponse en awk (s'il vous plait  :bounce)

Code :
  1. awk  monfichierdentree.txt '{print pouet1=$1, pouet2=$2,pouet3=$3,pouet4=$4}'>monfichierdesortie.txt


 

Code :
  1. le script precedent ecrit en awk permet de lire le contenu du fichier "monfichierdentree.txt" ligne par ligne et de generer une sortie dans le fichier monfichierdesortie.txt
  2. contenant les champs
  3. pouet1=..
  4. pouet2=..
  5. pouet3=...
  6. pouet4=...
  7. la valeur de chacun des champs est lue dans sur chaque chaque ligne du fichier d'entrée.
  8. il ya autant de champs de champs sur une ligne !


 
 


---------------
"Rendez tout aussi simple que possible mais ne simplifierez rien" Albert Einstein
n°1214138
Sve@r
Posté le 04-10-2005 à 10:28:52  profilanswer
 

axk47 a écrit :

ça y est j'ai trouvé  ;)  
voici la réponse en awk (s'il vous plait  :bounce)

Code :
  1. awk  monfichierdentree.txt '{print pouet1=$1, pouet2=$2,pouet3=$3,pouet4=$4}'>monfichierdesortie.txt


 

Code :
  1. le script precedent ecrit en awk permet de lire le contenu du fichier "monfichierdentree.txt" ligne par ligne et de generer une sortie dans le fichier monfichierdesortie.txt
  2. contenant les champs
  3. pouet1=..
  4. pouet2=..
  5. pouet3=...
  6. pouet4=...
  7. la valeur de chacun des champs est lue dans sur chaque chaque ligne du fichier d'entrée.
  8. il ya autant de champs de champs sur une ligne !



 
 
Awk est un outil extrèmement puissant. Il permet en effet d'effectuer des traitements complexes sur la ligne lue. Mais en général il impose de :
1) écrire un script awk
2) écrire un script shell pour utiliser le script awk.
 
Maintenant, si le traitement est simple, alors le shell peut suffire dans un seul script.
 
Il y a 2 moyens
1) se rappeler que la commande "read" lit l'entrée standard en s'arrêtant au "return" et qu'elle sort en statut "faux" quand il n'y a plus rien à lire => on peut récupérer ce statut dans un "while" ce qui donne:

Code :
  1. #!/bin/sh
  2. cat fichier_a_lire |while read ligne
  3. do
  4.     echo "ligne lue: $ligne"
  5. done


 
2) utiliser la commande "exec" qui va stocker tout le fichier dans un buffer qu'on lira ensuite tranquillement

Code :
  1. #!/bin/sh
  2. # On stocke le fichier dans le buffer 3
  3. exec 3<fichier_a_lire
  4. # On lit le buffer 3 ligne par ligne
  5. while read ligne 0<&3
  6. do
  7.     echo "ligne lue: $ligne"
  8. done


 
Ce système permet même de lire 2 (ou n) fichiers en parallèle

Code :
  1. #!/bin/sh
  2. # On stocke le fichier1 dans le buffer 3
  3. exec 3<fichier1
  4. # On stocke le fichier2 dans le buffer 4
  5. exec 4<fichier2
  6. # Boucle infinie
  7. while true
  8. do
  9.      # Lecture fichier 1
  10.      read lig1 0<&3
  11.      # Lecture fichier 2
  12.      read lig2 0<&4
  13.      # Sortie de boucle si lig1 ou lig2 vide
  14.      test -z "$lig1" -o -z "$lig2" && break
  15.      # Traitement ligne fichier 1 et fichier 2
  16.      ...
  17. done


 
T'as un très bon cours de shell complet et en français ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf


Message édité par Sve@r le 04-10-2005 à 10:32:15

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Shell] lecture d'un fichier txt ligne par ligne

 

Sujets relatifs
Comment sécuriser un download de fichier ?transcoder un fichier xml en utf-8
connaitre l'url du fichier html contenant le swfVideo : afficher la lecture en _self
Excel VBA - Importer depuis un fichier textecomment transformer un fichier xml en un tableau
Comment garder le retour à la ligne d'un TEXTAREA ??regénérer fichier resx
Syntaxe pour appeller un fichierTriturage de fichier en PERL
Plus de sujets relatifs à : [Shell] lecture d'un fichier txt ligne par ligne


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