Einlesen einer CSV-Datei mit „while IFS=“, wobei das Komma nicht als Trennzeichen behandelt wird, wenn das Feld in Anführungszeichen steht

Einlesen einer CSV-Datei mit „while IFS=“, wobei das Komma nicht als Trennzeichen behandelt wird, wenn das Feld in Anführungszeichen steht

Ich habe eine große CSV-Datei, in der die Spalten jeweils durch Kommas getrennt sind. In etwa 5 % der Fälle enthält die erste Spalte jedoch ein Komma und wird dadurch gekennzeichnet, dass diese Felder in Anführungszeichen gesetzt werden, wenn sie ein Komma enthalten.

Was wäre eine gute Möglichkeit, diese Datei einzulesen, ohne dass Kommas in Anführungszeichen als Trennzeichen behandelt werden?

Der beste Weg, der mir einfällt, wäre, etwas Komplexes mit einem Stapel oder so zu machen, um zu sehen, ob wir uns gerade innerhalb von Anführungszeichen befinden oder nicht, aber ich denke, es muss sicher einen einfacheren Weg geben. Hinweis: Es gibt nie Anführungszeichen innerhalb von Anführungszeichen oder andere Sonderfälle außer diesem.

*Beispiele:

  1. Apfel, 10, 12, ....
  2. Banane, 5, 10, ...
  3. „Banane, grün“, 3, 14, ... (Beachten Sie, dass diese Zeile ein Komma enthält, aber Anführungszeichen dies anzeigen)*

Ich möchte diese letzte Zeile lieber als „Banane, grün“ in eine Variable einlesen, statt dem Standardverhalten, bei dem „Banane“ und „Grün“ als separate Variablen eingelesen werden.

Antwort1

Mit GNU awk für FPAT:

$ cat tst.awk
BEGIN { FPAT="[^,]*|\"[^\"]*\"" }
{
    print
    for (i=1; i<=NF; i++) {
        print "\t" i, "<" $i ">"
    }
    print "---"
}

$ awk -f tst.awk file
Apple,10,12,...
        1 <Apple>
        2 <10>
        3 <12>
        4 <...>
---
Banana,5,10,...
        1 <Banana>
        2 <5>
        3 <10>
        4 <...>
---
"Banana, green",3,14,...
        1 <"Banana, green">
        2 <3>
        3 <14>
        4 <...>
---

verwandte Informationen