CSV bash

De knowledge
Aller à la navigation Aller à la recherche
== Comment parser des lignes type CSV en bash ==

Le concept est de premetre en bash des traitements similaires à awk tout en traitant le cas des colonnes délimitées par des " (doubles quotes).

Exemple de fichier texte (test.txt)

Nicolas "01 44 78 88 74"
Pascal "04 12 45 87"
"Jean Marie" "05 10 45 74 80"

Awk ne sait pas simplement gérer le problème des guillemets. Un programe awk du type:

$ cat test.txt | awk '{ print $1, $2 }'

Donnera le résultat :

Nicolas "01
Pascal "04
"Jean Marie"

Qui n'est pas le résultat espéré.

Traitement en bash

L'idée consiste a "évaluer" chaque ligne. On crée une commande créant un tableau de valeurs :

command="tab=($line)"

Où $ligne contient une ligne de notre fichier test.txt.

puis on l'évalue:

eval $command

on aura alors un tableau (de deux éléments dans le cas de test.txt). On peut les afficher par:

echo "${tab[0]},${tab[1]}"

Attention a la syntaxe "bizarre" des variables tableaux en bash!

Le programe en entier donne (test.sh):

#/usr/bin/bash
while read line;
do
  command="tab=($line)" ;
  eval $command ;
  echo "${tab[0]}=${tab[1]}"
done

On teste par:

$ cat test.txt | ./test.sh
Nicolas=01 44 78 88 74
Pascal=04 12 45 87
Jean Marie=05 10 45 74 80
$