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

lecture d'un fichier txt ligne par ligne [Shell] - Shell/Batch - Programmation

Marsh Posté le 03-10-2005 à 11:27:22    

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
Reply

Marsh Posté le 03-10-2005 à 11:27:22   

Reply

Marsh Posté le 03-10-2005 à 11:32:02    

Reply

Marsh Posté le 03-10-2005 à 11:36:26    


 
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
Reply

Marsh Posté le 03-10-2005 à 11:41:00    

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.

Reply

Marsh Posté le 03-10-2005 à 11:41:47    

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}
Reply

Marsh Posté le 03-10-2005 à 14:16:04    

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
Reply

Marsh Posté le 03-10-2005 à 14:19:46    

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

Reply

Marsh Posté le 03-10-2005 à 14:23:20    

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}
Reply

Marsh Posté le 03-10-2005 à 14:25:09    

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}
Reply

Marsh Posté le 03-10-2005 à 14:31:01    

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
Reply

Marsh Posté le 03-10-2005 à 14:31:01   

Reply

Marsh Posté le 03-10-2005 à 14:35:36    

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


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-10-2005 à 14:57:40    

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
Reply

Marsh Posté le 03-10-2005 à 17:22:43    

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
Reply

Marsh Posté le 04-10-2005 à 10:28:52    

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
Reply

Sujets relatifs:

Leave a Replay

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