staging.inyokaproject.org

Wrong number of fields oder zuviele Semikolon

Status: Ungelöst | Ubuntu-Version: Server 22.10 (Kinetic Kudu)
Antworten |

rurotil

Anmeldungsdatum:
7. April 2009

Beiträge: Zähle...

Hallo Leute,

ich habe eine CSV Datei, da wurden einige Spalten mit Hochkommas erstellt, weil innerhalb des Textes Semikolons vorkommen.

Hier ist meine CSV Datei

Customer Taxes;Internal reference;category;Name;Sales Description;Cost;Sales Price;img_url;Website;;
9811231134;"Telefone>Yealink";"Yealink T2x/T3x/T4x/T5x Netzteil";"Nicht für: VA59; PP860 EU-Stecker; T49G";3,00;22,00;https://test.com/e5/60/58/NetzteilzthHvfgXk7PwG.jpg;"https://test.com/yealink/2301/yealink-t2x/t3x/t4x/t5x-netzteil";
9278381350;"Headsets>Jabra";"Jabra Engage 65 Mono DECT Headset";"Jabra Engage 65 Mono: Robustes schnurlos Headset für Vieltelefonierer; Dual (2x) connectivity: Festnetz und PC Softphone; Tasten an Basisstation; verbesserte NC Mikrofon Technologie; bis zu 150m Reichweite; bis zu 13 Stunden Gesprächszeit Wideband mode; Busylight an der Mikrofonspitze und Hörkapsel; höchste DECT Sicherheit und bessere Nutzung der DECT Kanäle; Mono-Headset mit Überkopfbügel (Nackenbügel optional bestellbar Eine Kompatibilitäsprüfung und weitere Informationen finden Sie unter https://www.jabra.com.de/support#/";199,00;210,00;https://test.com/ba/38/aa/1516482tHi4asqrtwaX.jpg;"https://test.com/jabra/16657/jabra-engage-65-mono-dect-headset";

Wenn ich z.B. das ausführe, sind die Spalten vermischt.

awk -F";" '{OFS=";"} {print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}'  

Wenn ich die Datei hier überprüfen https://extendsclass.com/csv-validator.html lasse, bekomme ich das als Fehlermeldung:

row 1: wrong number of fields:
9811231134;Telefone>Yealink;Yealink T2x/T3x/T4x/T5x Netzteil;Nicht für: VA59; PP860 EU-Stecker; T49G;3,00;22,00;https://test.com/e5/60/58/NetzteilzthHvfgXk7PwG.jpg;https://test.com/yealink/2301/yealink-t2x/t3x/t4x/t5x-netzteil;

row 2: wrong number of fields:
9278381350;Headsets>Jabra;Jabra Engage 65 Mono DECT Headset;Jabra Engage 65 Mono: Robustes schnurlos Headset für Vieltelefonierer; Dual (2x) connectivity: Festnetz und PC Softphone; Tasten an Basisstation; verbesserte NC Mikrofon Technologie; bis zu 150m Reichweite; bis zu 13 Stunden Gesprächszeit Wideband mode; Busylight an der Mikrofonspitze und Hörkapsel; höchste DECT Sicherheit und bessere Nutzung der DECT Kanäle; Mono-Headset mit Überkopfbügel (Nackenbügel optional bestellbar Eine Kompatibilitäsprüfung und weitere Informationen finden Sie unter https://www.jabra.com.de/support#/;199,00;210,00;https://test.com/ba/38/aa/1516482tHi4asqrtwaX.jpg;https://test.com/jabra/16657/jabra-engage-65-mono-dect-headset;

Wie bekomme ich die Spalten richtig getrennt?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4212

Naja, die ersten beiden Zeilen enthalten jeweils 10 Semikolons, die letzte aber 16.

Vielleicht solltest Du Dir, wie in einigen deiner letzten Themen auch schon von anderen vorgeschlagen wurde, dann doch lieber eine Programmiersprache verwenden, die gut mit CSV umgehen kann, siehe z.B.: https://docs.python.org/3/library/csv.html

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Doc_Symbiosis schrieb:

Vielleicht solltest Du Dir, wie in einigen deiner letzten Themen auch schon von anderen vorgeschlagen wurde, dann doch lieber eine Programmiersprache verwenden, die gut mit CSV umgehen kann, siehe z.B.: https://docs.python.org/3/library/csv.html

... oder https://ruby-doc.org/3.2.2/stdlibs/csv/CSV.html.

rurotil

(Themenstarter)

Anmeldungsdatum:
7. April 2009

Beiträge: 96

Danke für eure Tipps, wenn es wirklich mehr werden sollte würde ich mir das schon überlegen. Im Moment sind es bei mir gerade mal 4-5 CSV Dateien und davon hat bisher 90% funktioniert.

Bisher habt ihr mir wirklich sehr geholfen und soweit funktioniert alles.

Gibt es für das Problem, keine Lösung mit sed oder awk?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

rurotil schrieb:

Danke für eure Tipps, wenn es wirklich mehr werden sollte würde ich mir das schon überlegen. Im Moment sind es bei mir gerade mal 4-5 CSV Dateien und davon hat bisher 90% funktioniert.

Wenn ich mir den Aufwand anschaue allein hier im Forum, dann denke ich, eine passende Lösung hätte sich schon gelohnt.

Gibt es für das Problem, keine Lösung mit sed oder awk?

Vielleicht schon, aber Du brichst Dir dabei die Finger: sed kennt das Konzept von Feldern gar nicht und awk kennt das Konzept "Trenner in einer Zeichenkette mit Anführungsstrichen" nicht. Mit Tools, die CSV wirklich unterstützen, ist das ein Klacks, wie ich ja schon mal gezeigt habe.

Ah, Moment, ich sehe gerade, awk kennt FPAT. Damit definiert man einen regulären Ausdruck, der ein Feld bestimmt. Damit sollte das einfacher gehen. Nimm das mal zum Spielen:

1
2
3
4
5
6
7
#!/bin/sh

awk -v 'FPAT="[^"]*"|[^;]*' '
{
  for (i=1; i<=NF; ++i) printf "Field %2d <%s>\n", i, $i
}
' "$@"

shiro

Anmeldungsdatum:
20. Juli 2020

Beiträge: 611

rklm schrieb:

Ah, Moment, ich sehe gerade, awk kennt FPAT.

Danke für den Hinweis!!!

Ich habe FPAT bisher sehr selten genutzt und auch nur bei gawk. Dazu kam, dass bei einigen Betriebssystemen selbst gawk den FPAT nicht immer gesichert unterstützte. Dazu kamen Probleme, wenn ein Feld über mehrere Zeilen ging ("embedded \n"), was sich aber leicht beheben ließ (sed,tr). Es war aber immer die einfacherer Lösung als über "csvquote" und/oder "gawkextlib" eine "Spezialversion" zu nutzen.

Bisher war ich immer der Ansicht, dass native awk den FPAT nicht supported.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

shiro schrieb:

rklm schrieb:

Ah, Moment, ich sehe gerade, awk kennt FPAT.

Danke für den Hinweis!!!

Haben wir beide was gelernt. ☺

Ich habe FPAT bisher sehr selten genutzt und auch nur bei gawk. Dazu kam, dass bei einigen Betriebssystemen selbst gawk den FPAT nicht immer gesichert unterstützte. Dazu kamen Probleme, wenn ein Feld über mehrere Zeilen ging ("embedded \n"), was sich aber leicht beheben ließ (sed,tr). Es war aber immer die einfacherer Lösung als über "csvquote" und/oder "gawkextlib" eine "Spezialversion" zu nutzen.

Ja, alle diese Ansätze sind eklig.

Bisher war ich immer der Ansicht, dass native awk den FPAT nicht supported.

Gerade mal geschaut: der awk unter WSL2 ist tatsächlich GNU awk. In jedem Fall ist eine CSV-Bibliothek in einer Lieblingsskriptsprache die eindeutig bessere Lösung. Der Regex, den ich da verwendet habe, ist ja auch nicht vollständig. Man möchte z.B. ein " in einer Zeichenkette via Escape Sequence erlauben.

Antworten |