Je travaille sur un long script Bash. Je veux lire les cellules d'un fichier CSV dans des variables Bash. Je peux analyser les lignes et la première colonne, mais pas toute autre colonne. Voici mon code pour l'instant:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Il n'imprime que la première colonne. Comme test supplémentaire, j'ai essayé ce qui suit:
read -d, x y < <(echo a,b,)
Et $ y est vide. Alors j'ai essayé:
read x y < <(echo a b)
Et $ y est b
. Pourquoi?
awk
à utiliser$1
,$2
etc?Réponses:
Vous devez utiliser
IFS
au lieu de-d
:Notez que pour l'analyse CSV à usage général, vous devez utiliser un outil spécialisé qui peut gérer les champs entre guillemets avec des virgules internes, entre autres problèmes que Bash ne peut pas gérer par lui-même. Des exemples de tels outils sont
cvstool
etcsvkit
.la source
command not found
. Seuls lesecho
travaux.;
:while IFS=";" read col1 col2; do ...
${var}
), mais je les omette lorsqu'elles ne sont pas nécessaires. Pour moi, ça a l'air plus propre.Depuis la
man
page:Vous utilisez
-d,
ce qui terminera la ligne de saisie sur la virgule. Il ne lira pas le reste de la ligne. C'est pourquoi $ y est vide.la source
Nous pouvons analyser les fichiers csv avec des chaînes entre guillemets et délimités par say | avec le code suivant
awk analyse les champs de chaîne en variables et tr supprime le guillemet.
Légèrement plus lent car awk est exécuté pour chaque champ.
la source
Si vous voulez lire un fichier CSV avec quelques lignes, voici la solution.
la source