Wie behandelt man Kommas innerhalb einer CSV-Datei, die vom Bash-Skript gelesen wird?

8

Ich erstelle ein Bash-Skript, um eine Ausgabe aus einer CSV-Datei zu erzeugen (ich habe über 1000 Einträge und möchte es nicht von Hand machen ...).

Der Inhalt der CSV-Datei sieht ähnlich aus:

%Vor%

Ich habe einen Code, der die Felder trennen kann, indem er das Komma als Trennzeichen verwendet. Einige Werte enthalten jedoch Kommata, z. B. Adygeya, Republic . Diese Werte sind in Anführungszeichen eingeschlossen, um anzugeben, dass die Zeichen innerhalb des Feldes behandelt werden sollen, aber ich weiß nicht, wie man es analysiert, um dies zu berücksichtigen.

Momentan habe ich diese Schleife:

%Vor%

erzeugt diese Ausgabe für die oben angegebenen Beispieldaten:

%Vor%

Wie Sie sehen, wird der dritte Eintrag falsch analysiert. Ich möchte es ausgeben

%Vor%     
chrisbunney 20.01.2012, 10:58
quelle

6 Antworten

8

Wenn Sie alles in awk tun möchten ( GNU awk 4 ist erforderlich, damit dieses Skript wie vorgesehen funktioniert):

%Vor%

Beispielausgabe:

%Vor%

Mit Perl :

%Vor%

Dies sollte mit Ihrer awk-Version funktionieren (basierend auf dies cus posten, entfernte auch die eingebetteten Kommas).

%Vor%     
Dimitre Radoulov 23.01.2012, 12:30
quelle
5

Nachdem Sie @ Dimitres Lösung über hier angeschaut haben. Sie können so etwas tun -

%Vor%

Test:

%Vor%

Um " zu entfernen, können Sie die Ausgabe nach sed pipen.

%Vor%     
jaypal singh 23.05.2017 12:25
quelle
2

Nachdem ich über das Problem nachgedacht habe, wurde mir klar, dass das Komma in der Zeichenfolge für mich nicht wichtig ist. Es wäre einfacher, es einfach vor dem Parsen aus der Eingabe zu entfernen.

Zu diesem Zweck habe ich einen sed -Befehl erstellt, der Strings entspricht, die von doppelten Anführungszeichen umgeben sind, die ein Komma enthalten. Der Befehl entfernt dann die nicht benötigten Bits aus der übereinstimmenden Zeichenfolge. Dies geschieht, indem die Regex in Erinnerungsabschnitte unterteilt wird.

Diese Lösung funktioniert nur, wenn die Zeichenfolge ein einzelnes Komma zwischen doppelten Anführungszeichen enthält.

Die nicht-residente Regex ist

%Vor%

Das erste, dritte und fünfte Klammerpaar erfasst das doppelte Anführungszeichen, das Komma und das doppelte Anführungszeichen.

Das zweite und dritte Klammerpaar erfassen den tatsächlichen Inhalt des Feldes, das wir behalten möchten.

sed Befehl zum Entfernen eines Kommas :

%Vor%

sed Befehl zum Entfernen von Komma und doppelten Anführungszeichen :

%Vor%

Aktualisierter Code :

%Vor%

Ausgabe :

%Vor%     
chrisbunney 20.01.2012 16:30
quelle
0

Aufgrund der etwas veralteten Version von awk auf meinem System und einer persönlichen Vorliebe, bei einem Bash-Skript zu bleiben, bin ich zu einer etwas anderen Lösung gekommen.

Ich habe ein Hilfsskript erstellt, das auf diesem Blogpost basiert, der analysiert wird die CSV-Datei und ersetzt die Trennzeichen durch ein Trennzeichen Ihrer Wahl, so dass die Ausgabe erfasst und zur einfachen Verarbeitung der Daten verwendet werden kann. Das Skript berücksichtigt in Anführungszeichen gesetzte Zeichenfolgen und eingebettete Kommas, entfernt jedoch doppelte Anführungszeichen und funktioniert nicht mit doppelten Anführungszeichen in Feldern.

%Vor%

Schreib es einfach auf, falls jemand anderes es nützlich findet.

    
chrisbunney 23.01.2012 13:11
quelle
0

Wenn Sie zulassen können, dass die umgebenden Anführungszeichen in der Ausgabe erhalten bleiben, können Sie ein kleines Skript namens csvquote verwenden, um awk und cut (und andere UNIX-Textwerkzeuge) für die korrekte Behandlung von Feldern mit Kommas zu verwenden. Sie wickeln den Befehl so:

%Vor%

Siehe Ссылка für den Code und die Dokumentation

    
D Bro 04.05.2013 23:45
quelle
0

Mit Dimitres Lösung (danke dafür) habe ich bemerkt, dass sein Programm leere Felder ignoriert.

Hier ist das Problem:

%Vor%     
Sven L. 05.01.2014 09:48
quelle

Tags und Links