{"id":20,"date":"2013-03-10T15:36:13","date_gmt":"2013-03-10T14:36:13","guid":{"rendered":"http:\/\/sam-soul.fr\/Info\/?p=20"},"modified":"2013-03-10T15:36:13","modified_gmt":"2013-03-10T14:36:13","slug":"comment-lire-un-fichier-ligne-par-ligne","status":"publish","type":"post","link":"http:\/\/les-fougs.com\/wordpress\/2013\/03\/10\/comment-lire-un-fichier-ligne-par-ligne\/","title":{"rendered":"Comment lire un fichier ligne par ligne"},"content":{"rendered":"<h2>Pr\u00e9ambule<\/h2>\n<p>Une des erreurs les plus communes dans l&rsquo;apprentissage des scripts &laquo;&nbsp;bash&nbsp;&raquo; sous <a href=\"http:\/\/www.commentcamarche.net\/s\/gnu-linux\">GNU\/LInux<\/a> pour lire un fichier ligne par ligne, est d&rsquo;utiliser une boucle &laquo;&nbsp;for&nbsp;&raquo; (for line in $(cat file.txt); do &#8230;), ce qui dans cet exemple conduit \u00e0 une \u00e9valuation, non pas de chaque ligne du fichier, mais de chaque mot ! Ce qui n&rsquo;est pas du tout le but recherch\u00e9&#8230;<\/p>\n<p>Exemple de sortie avec une boucle &laquo;&nbsp;for&nbsp;&raquo; :<\/p>\n<pre>for line in $(cat file.txt); do echo \"$line\" ; done Ceci est la ligne n\u00b0 1 Ceci est la ligne n\u00b0 2 Ceci [...]<\/pre>\n<p>La solution consiste \u00e0 utiliser une boucle &laquo;&nbsp;while&nbsp;&raquo; coupl\u00e9e \u00e0 la commande interne &laquo;&nbsp;read&nbsp;&raquo;.<\/p>\n<p>Mais il est cependant possible d&rsquo;obtenir le me r\u00e9sultat avec une boucle &laquo;&nbsp;for&nbsp;&raquo; \u00e0 condition de changer la valeur de la variable &laquo;&nbsp;$IFS&nbsp;&raquo; (Internal Field Separator, s\u00e9parateur de champ interne) avant de lancer la boucle. C&rsquo;est ce que nous verrons par la suite&#8230;<\/p>\n<h2>Boucle while<\/h2>\n<p>La boucle &laquo;&nbsp;while&nbsp;&raquo; reste la m\u00e9thode la plus appropri\u00e9e et la plus simple pour lire un fichier ligne par ligne.<\/p>\n<h2>Syntaxe<\/h2>\n<p>while read ligne do commande done &lt; fichier<\/p>\n<p>Exemple<\/p>\n<p>Le fichier de d\u00e9part :<\/p>\n<pre>Ceci est la ligne n\u00b0 1 \nCeci est la ligne n\u00b0 2 \nCeci est la ligne n\u00b0 3\nCeci est la ligne n\u00b0 4\nCeci est la ligne n\u00b0 5<\/pre>\n<p>Les instructions en ligne de commande :<\/p>\n<pre>while read line; do echo -e \"$line\\n\"; done &lt; file.txt<\/pre>\n<p>ou dans un script &laquo;&nbsp;bash&nbsp;&raquo; :<\/p>\n<pre>#! \/bin\/bash while read line do echo -e \"$line\\n\" done &lt; file.txt<\/pre>\n<p>La sortie sur l&rsquo;\u00e9cran (stdout) :<\/p>\n<pre>Ceci est la ligne n\u00b0 1\nCeci est la ligne n\u00b0 2\nCeci est la ligne n\u00b0 3\nCeci est la ligne n\u00b0 4\nCeci est la ligne n\u00b0 5<\/pre>\n<h2><span style=\"font-family: 'Open Sans Condensed', sans-serif; font-size: 1em;\">Astuces<\/span><\/h2>\n<p>Il vous est tout a fait possible \u00e0 partir d&rsquo;un fichier structur\u00e9 (comme un carnet d&rsquo;adresse ou \/etc\/passwd par exemple), de r\u00e9cup\u00e9rer les valeurs de chaque champ et de les affecter \u00e0 plusieurs variables avec la commande &laquo;&nbsp;read&nbsp;&raquo;. Attention toutefois de bien assigner \u00e0 la variable &laquo;&nbsp;IFS&nbsp;&raquo; le bon s\u00e9parateur de champ (espace par d\u00e9faut).<\/p>\n<p>Exemple :<\/p>\n<pre>#! \/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 &lt; \/etc\/passwd<\/pre>\n<p><a name=\"bonus\"><\/a><\/p>\n<h2>Bonus<\/h2>\n<p>while read i; do echo -e &laquo;&nbsp;Param\u00e8tre : $i&nbsp;&raquo;; done &lt; &lt;(echo -e &laquo;&nbsp;a\\nab\\nc&nbsp;&raquo;)<\/p>\n<h2>Boucle for<\/h2>\n<p>Si la boucle &laquo;&nbsp;while&nbsp;&raquo; reste la m\u00e9thode la plus simple, elle a toutefois un inconv\u00e9nient majeur, \u00e0 savoir qu&rsquo;elle annihile le formatage des lignes et notamment les espaces et tabulations ;-\\<br \/>\nHeureusement la boucle &laquo;&nbsp;for&nbsp;&raquo; coupl\u00e9e avec un changement d&rsquo;IFS permet de garder la structure du document en sortie.<br \/>\n<a name=\"syntaxe\"><\/a><\/p>\n<h3>Syntaxe<\/h3>\n<p>oldIFS=$IFS # sauvegarde du s\u00e9parateur de champ IFS=$&rsquo;\\n&rsquo; # nouveau s\u00e9parateur de champ, le caract\u00e8re fin de ligne for ligne in $(cat fichier) do commande done IFS=$old_IFS # r\u00e9tablissement du s\u00e9parateur de champ par d\u00e9faut<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9ambule Une des erreurs les plus communes dans l&rsquo;apprentissage des scripts &laquo;&nbsp;bash&nbsp;&raquo; sous GNU\/LInux pour lire un fichier ligne par ligne, est d&rsquo;utiliser une boucle &laquo;&nbsp;for&nbsp;&raquo; (for line in $(cat file.txt); do &#8230;), ce qui dans cet exemple conduit \u00e0 une \u00e9valuation, non pas de chaque ligne du fichier, mais de chaque mot ! Ce &hellip; <a href=\"http:\/\/les-fougs.com\/wordpress\/2013\/03\/10\/comment-lire-un-fichier-ligne-par-ligne\/\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Comment lire un fichier ligne par ligne&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[51],"tags":[],"_links":{"self":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/20"}],"collection":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/comments?post=20"}],"version-history":[{"count":0,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/posts\/20\/revisions"}],"wp:attachment":[{"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/media?parent=20"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/categories?post=20"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/les-fougs.com\/wordpress\/wp-json\/wp\/v2\/tags?post=20"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}