Flux rss
Collection CommentCaMarche.net

Comment lire un fichier ligne par ligne

Publié par jipicy, dernière mise à jour le samedi 14 juillet 2007 à 16:22:39 par jipicy

Comment lire un fichier ligne par ligne



Préambule


Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier ligne par ligne, est d'utiliser une boucle "for" (for line in $(cat file.txt); do ...), ce qui dans cet exemple conduit à une évaluation, non pas de chaque ligne du fichier, mais de chaque mot ! Ce qui n'est pas du tout le but recherché...

Exemple de sortie avec une boucle "for" :
for line in $(cat file.txt); do echo "$line" ; done
Ceci
est
la
ligne
n°
1
Ceci
est
la
ligne
n°
2
Ceci
[...]

La solution consiste à utiliser une boucle "while" couplée à la commande interne "read".

Mais il est cependant possible d'obtenir le me résultat avec une boucle "for" à condition de changer la valeur de la variable "$IFS" (Internal Field Separator, séparateur de champ interne) avant de lancer la boucle. C'est ce que nous verrons par la suite...

Boucle while


La boucle "while" reste la méthode la plus appropriée et la plus simple pour lire un fichier ligne par ligne.

Syntaxe


while read ligne
do
   commande
done < fichier

Exemple


Le fichier de départ :
Ceci est la ligne n° 1
Ceci est la ligne n° 2
Ceci est la ligne n° 3
Ceci est la ligne n° 4
Ceci est la ligne n° 5

Les instructions en ligne de commande :
while read line; do echo -e "$line\n"; done < file.txt

ou dans un script "bash" :
#! /bin/bash

while read line
do 
   echo -e "$line\n"
done < file.txt

La sortie sur l'écran (stdout) :
Ceci est la ligne n° 1

Ceci est la ligne n° 2

Ceci est la ligne n° 3

Ceci est la ligne n° 4

Ceci est la ligne n° 5

Astuces


Il vous est tout a fait possible à partir d'un fichier structuré (comme un carnet d'adresse ou /etc/passwd par exemple), de récupérer les valeurs de chaque champ et de les affecter à plusieurs variables avec la commande "read". Attention toutefois de bien assigner à la variable "IFS" le bon séparateur de champ (espace par défaut).

Exemple :
#! /bin/bash

while IFS=: read user pass uid gid full home shell
do
echo -e "$full :\n\
	Pseudo : $user\n\
	UID :\t $uid\n\
	GID :\t $gid\n\
	Home :\t $home\n\
	Shell :\t $shell\n\n"
done < /etc/passwd

Bonus


while read i; do echo -e "Paramètre : $i"; done < <(echo -e "a\nab\nc")

Boucle for


Si la boucle "while" reste la méthode la plus simple, elle a toutefois un inconvénient majeur, à savoir qu'elle annihile le formatage des lignes et notamment les espaces et tabulations ;-\
Heureusement la boucle "for" couplée avec un changement d'IFS permet de garder la structure du document en sortie.

Syntaxe


oldIFS=$IFS     # sauvegarde du séparateur de champ
IFS=$'\n'     # nouveau séparateur de champ, le caractère fin de ligne
for ligne in $(cat fichier)
do
   commande
done
IFS=$old_IFS     # rétablissement du séparateur de champ par défaut
[shell unix] fichier ligne par ligne (Résolu) Bonjour, comment faire défiler un fichier ligne par ligne, de manière à traiter chaque ligne ? Merci de votre aide www.commentcamarche.net/forum/affich-1702792-shell-unix-fichier-ligne-par-ligne
Problème pour lire fichier de Open office org (Résolu) Bonjour, j'ai besoin d'envoyer un fichier (traitement de texte) par mail. Mais la personne à qui je dois l'envoyer n'arrive pas à lire (fichier odt) Avez vous des idées ? (à part faire copier coller : s merci www.commentcamarche.net/forum/affich-8545716-probleme-pour-lire-fichier-de-open-office-org
[shell]lire une ligne dans un fichier (Résolu) Bonjour, je suis entrain d'écrire un scripte shell et je veux lire une ligne dans un fichier plus précissement je veux une genre de fonction à laquelle je passe un paramettre qui correspond à un numéro de ligne et cette fonction doit me renvoyer... www.commentcamarche.net/forum/affich-9150195-shell-lire-une-ligne-dans-un-fichier
Qu'est-ce qu'un fichier batch ?POURQUOI FAIRE ? COMMENT FAIRE ? Préalables Création du fichier POURQUOI FAIRE ? Windows est fourni avec une version du DOS, ce qui permet d'exploiter les fonctionnalités et l'enchaînement de commandes définies dans un script. Un fichier... www.commentcamarche.net/faq/sujet-5967-qu-est-ce-qu-un-fichier-batch
Installer un émulateur ARM gratuitIl se peut que vous ayez besoin de tester du code assembleur pour processeur arm, simplement parce que vous êtes étudiant ou professionnel. Le problème c'est que la plupart des ordinateurs que nous utilisons ont des processeurs de famille x86, il... www.commentcamarche.net/faq/sujet-9058-installer-un-emulateur-arm-gratuit
[Python] Lire et écrire des fichiers CSVLIRE ET ÉCRIRE DES FICHIERS CSV Python www.python.org, dans sa version 2.4 supporte de facto le format CSV (comma-separated values: valeurs séparées par des virgules). La Library Reference est certes très explicative à ce... www.commentcamarche.net/faq/sujet-2382-python-lire-et-ecrire-des-fichiers-csv
Lire une ligne d'un fichier (Résolu)Bonjour, Je cherche à lire une ligne N dans un fichier. line=57; # la ligne $result="file.txt"; # le fichier cmd="sed -n '$line,$line d' $result" tempsEcoule= eval $cmd; Mais apparement, je n'ai pas tout bien compris de la commande sed... www.commentcamarche.net/forum/affich-4128573-lire-une-ligne-d-un-fichier
Double lecture de fichier ligne par ligne (Résolu)bonjour , J'ai suivi le "cours" pour la lecture de fichier ligne par ligne (jicipy) Comment lire un fichier ligne par ligne Je voudrai lire un fichier ligne par ligne , et comparer en même temps avec les ligne d'un autre fichier. exemple : -... www.commentcamarche.net/forum/affich-5123422-double-lecture-de-fichier-ligne-par-ligne
[C++] lire un fichier texte ligne par ligne (Résolu)Bonjour tout le monde, J'ai recherché quelque temps sur le forum un moyen de lire un fichier ligne par ligne en c++. J'ai trouvé plusieurs façon, mais aucune ne marchant vraiment, ou en tout cas, soit pas de la façon dont je voulais, soit à... www.commentcamarche.net/forum/affich-2485838-c-lire-un-fichier-texte-ligne-par-ligne
Fichier CSVFormat CSV Un fichier CSV est un fichier tableur, contenant des données sur chaque ligne séparés par un caractère de séparation (généralement une virgule ou un point-virgule). Comment lire un fichier CSV ? Il peut être lu avec un tableur tel que... www.commentcamarche.net/contents/fichier/csv.php3