it-swarm.com.de

Wie kann ich eine CSV-Datei in Bash analysieren?

Ich arbeite an einem langen Bash-Skript. Ich möchte Zellen aus einer CSV-Datei in Bash-Variablen einlesen. Ich kann Zeilen und die erste Spalte analysieren, aber keine andere Spalte. Hier ist mein Code:


  cat myfile.csv|while read line
  do
    read -d, col1 col2 < <(echo $line)
    echo "I got:$col1|$col2"
  done

Es wird nur die erste Spalte gedruckt. Als zusätzlichen Test habe ich Folgendes ausprobiert:

read -d, x y < <(echo a,b,)

Und $ y ist leer. Also habe ich versucht:

read x y < <(echo a b)

Und $ y ist b. Warum?

83
User1

Sie müssen IFS anstelle von -d verwenden:

while IFS=, read -r col1 col2
do
    echo "I got:$col1|$col2"
done < myfile.csv

Beachten Sie, dass Sie für die allgemeine CSV-Analyse ein spezielles Tool verwenden sollten, das mit Feldern versehene Felder mit internen Kommas behandeln kann, unter anderem, die Bash nicht selbst bearbeiten kann. Beispiele für solche Werkzeuge sind cvstool und csvkit .

166

Von der man Seite:

-d Abgrenzung Das erste Zeichen von delim wird verwendet, um die Eingabezeile zu beenden eher als newline.

Sie verwenden -d,, wodurch die Eingabezeile im Komma beendet wird. Der Rest der Zeile wird nicht gelesen. Deshalb ist $ y leer.

7
dogbane

Wir können csv-Dateien mit in Anführungsstrichen stehenden Zeichenfolgen analysieren und durch say | trennen mit folgendem Code

while read -r line
do
    field1=$(echo $line | awk -F'|' '{printf "%s", $1}' | tr -d '"')
    field2=$(echo $line | awk -F'|' '{printf "%s", $2}' | tr -d '"')

    echo $field1 $field2
done < $csvFile

awk parst die String-Felder in Variablen und tr entfernt das Zitat. 

Etwas langsamer, da awk für jedes Feld ausgeführt wird.

0
Maithilish