CSV, das schlecht spezifizierte Format

  Ralf Hersel   Lesezeit: 6 Minuten  🗪 10 Kommentare

Bitte nennt CSV-Dateien nicht 'Comma separated values'.

csv, das schlecht spezifizierte format

Auf der Jagd nach neuen Themen bin ich vorhin über einen Artikel bei Tecmint gestossen. Der Blog bezeichnet sich als "A beginner-friendly guide for Linux", was eine tolle Intention für eine Publikation ist. Also nichts gegen Tecmint; macht weiter so, ihr werdet gebraucht. Meine Aufmerksamkeit hat dieser Artikel erregt: How to Convert CSV File to TSV File in Linux. Sagt euch das Format TSV etwas? Mir nicht.

Im Artikel wird beschrieben, wie man eine CSV-Datei in eine 'Tabulator separierte Datei' (TSV) umwandelt. Da lohnt es sich, zuerst einmal nachzusehen, was CSV überhaupt bedeutet. Gemäss Wikipedia steht CSV für 'Comma separated values', was meiner Meinung nach Unsinn ist. Ich bezeichne das Format als 'Character separated values', womit ich hoffentlich dem allgemeinen Empfingen für dieses Format entspreche.

Schaut man in die Spezifikation aus dem Jahr 2005 (RFC 4180), wird CSV so definiert (vereinfacht):

  • Jeder Datensatz steht in einer eigenen Zeile
  • Eine Zeile wird mit einem Zeilenende-Zeichen abgeschlossen
  • Der letzte Datensatz wird mit oder ohne Zeilenende-Zeichen abgeschlossen
  • Die erste Zeile kann (muss aber nicht) die Spaltenüberschriften (im selben Format) enthalten
  • Jedes Feld (innerhalb eines Datensatzes) kann (muss aber nicht) in Hochkommata gesetzt sein
  • Die einzelnen Felder werden durch das Kommazeichen voneinander abgegrenzt
  • US-ASCII als Standard Zeichenkodierung

Hier ist ein Beispiel für eine CSV-Datei mit Überschrift (1. Zeile) und Hochkommata, um dem Problem von Kommata innerhalb der Felder zu begegnen:

"Name", "Grösse", "Alter", "Wohnort"
"Hugo", "170", "31", "Berlin"
"Sandra", "165", "25", "Zürich"
"Melanie", "167", "49", "Köln"
"Peter", "172", "18", "Frankfurt"

In diesem Beispiel hätte man sich die Quotes (") sparen können, weil in keinem Feld das Kommazeichen vorkommt. Im Kapitel Specification des Wikipedia-Eintrags, wird RFC 4180 relativiert. Dort steht (u. a.):

Wobei die Datensätze in Felder unterteilt sind, die durch Begrenzungszeichen getrennt sind (normalerweise ein einzelnes reserviertes Zeichen wie Komma, Semikolon oder Tabulator ..

Aha, jetzt kommen wir der Realität schon einen Schritt näher, von wegen Komma. In einer neueren Spezifikation (RFC 7111) werden immer noch keine klaren Aussagen zum Separator gemacht. In der deutschen Wikipedia wird zumindest die Variante 'tab separated values' (TSV) erwähnt. Als Begründung für den TAB wird angebracht, dass dieser innerhalb der Feldinhalte nicht vorkommt, was Unsinn ist. Wer schon einmal eine Excel-Tabelle nach CSV exportiert hat, weiss, dass alle erdenklichen Zeichen (Tabs, Zeilenumbrüche, Sonderzeichen) in einem Feld vorkommen können. Allgemein gilt das CSV-Format als unterspezifiziert, bzw. als nicht realitätskonform, wenn man die beiden RFCs betrachtet.

Meiner Meinung nach fehlen insbesondere zwei Dinge: die Spezifikation des Separators und der Zeichenformatierung. Als Separator zwischen den Feldern sollte jedes Zeichen (innerhalb des gewählten Zeichensatzes) vorkommen dürfen. Die Zeichenformatierung ist auch ein spezielles Thema. Dazu möchte ich einen typischen Use Case schildern:

Angenommen, ihr seid in einer Microsoft-lastigen Büroumgebung beschäftigt. Dort gilt es, einen Export aus einer SQL-Datenbank für andere (wenig technikaffine Abteilungen) aufzubereiten. Beim Export aus der Datenbank entscheidet ihr euch für das CSV-Format und UTF-8 als Zeichenformat. Dann importiert ihr diese Datei in MS-Excel. Herzlichen Glückwunsch; mit einem Klick ist das nicht zu erledigen. Aus diesem Grund habe ich immer ein LibreOffice-Calc zur Hand, welches wesentlich souveräner mit einem CSV-Import umgeht als Excel. Calc fragt beim Import nach dem Trennzeichen, dem Quote-Zeichen und dem Zeichenformat. Ausserdem zeigt es eine Vorschau an. Herz, was willst du mehr?

Zurück zum Ausgangspunkt. Im Tecmint-Artikel werden fünf Varianten für die Konvertierung von CSV in TSV erläutert: awk, sed, csvkit, Python und Perl. Doch wozu? Zum einen versagen die Vorschläge, wenn sich der Separator innerhalb eines Datenfeldes befindet oder wenn eine ungewöhnliche Zeichenformatierung zugrunde liegt (ausser beim Python-Beispiel, in dem die Python-CSV-Library verwendet wird). Zum anderen ist eine Konvertierung gar nicht nötig, wenn man die weitere Verwendung der CSV-Datei in Betracht zieht (siehe mein Beispiel mit dem LibreOffice-Import).

Fazit: Bitte nennt CSV 'character separated value', vergesst das Komma und achtet auf die Zeichenformatierung.

Quellen:

https://www.tecmint.com/convert-csv-to-tsv/#4_Using_Python_Script
https://de.wikipedia.org/wiki/CSV_(Dateiformat)
https://en.wikipedia.org/wiki/Comma-separated_values
https://datatracker.ietf.org/doc/html/rfc4180
https://datatracker.ietf.org/doc/html/rfc7111

Bildquelle: https://i.stack.imgur.com/f6nke.jpg

Tags

CSV, CSV-Datei, Daeiformat, Separator, Trennzeichen, Zeichenformat

Tim Moritz
Geschrieben von Tim Moritz am 19. Juni 2023 um 11:29

'character separated values' gefällt mir :) irgendwo hab ich auch schon 'colon seperated values' gelesen, was die ganze Geschichte noch komplizierter macht

aynoS
Geschrieben von aynoS am 19. Juni 2023 um 12:31

Hmm, "Calc fragt beim Import nach dem Trennzeichen, dem Quote-Zeichen und dem Zeichenformat. Ausserdem zeigt es eine Vorschau an": Genau das macht hier im Büro mein Excel auch, mit allen möglichen Einstellungen für verschieden Separatoren, Texterkennungszeichen, mit/ohne Überschrift etc https://p.siduction.org/K

Ralf Hersel
Geschrieben von Ralf Hersel am 19. Juni 2023 um 18:08

Dann mach mal einen Doppelklick auf die CSV-Datei, die du vorher aus einer DB exportiert hast.

neffets
Geschrieben von neffets am 19. Juni 2023 um 13:17

Es geht noch schlimmer:

Als exotischstes Trennzeichen ist mir mal ein "¤" untergekommen.

Auch habe ich schon ein Format mit festen Spaltenlängen gesehen, wo also Textfelder linksbündig und Zahlenfelder rechtsbündig mit Leerzeichen aufgefüllt sind.

Ein Wiki-Leser
Geschrieben von Ein Wiki-Leser am 19. Juni 2023 um 16:05

Der Wikipedia-Artikel https://de.wikipedia.org/wiki/CSV_(Dateiformat) sagt im ersten Satz (19.6.2023): "Das Dateiformat CSV steht für englisch Comma-separated values (seltener Character-separated values [Quelle Louis/Müller von 2007]) und beschreibt den Aufbau einer Textdatei zur Speicherung oder zum Austausch einfach strukturierter Daten." Auch die Begriffsklärungssseite https://de.wikipedia.org/wiki/CSV nennt schon beide Möglichkeiten: "Comma-Separated Values oder Character-Separated Values, ein Dateiformat, siehe CSV (Dateiformat)"

Edwin Schwab
Geschrieben von Edwin Schwab am 19. Juni 2023 um 19:52

Die Spaces nach dem Komma im Beispiel dürften auch nicht ganz koscher sein ;-)

Vincent Wilms
Geschrieben von Vincent Wilms am 19. Juni 2023 um 21:16

Es gab mal Bestrebungen CSV Metadaten besser zu spezifizieren und CSV Datein zu validieren durch die "CSV on the web" Working Group (https://w3c.github.io/csvw/primer/). Da scheint sich aber nicht mehr viel zu tun und ich bin am Ende bei "Frictionless data" gelandet. Metadaten werden im .json Format mitgeliefert und diese Datei beschreibt zudem Aufbau + Format der "CSV"-Datei und die Datentypen der Spalten. Mit dem Python Tooling lässt sich eine vorhandene CSV Datei dann validieren: https://framework.frictionlessdata.io/

Alfons Schuck
Geschrieben von Alfons Schuck am 20. Juni 2023 um 09:40

CSV ist irgendwie der Klassiker für gut menschenlesbar, halbwegs maschinenlesbar. Daher ist es natürlich sehr beliebt für eigene (Mess-)Programme. Mich stört aber zusätzlich, dass der Dezimaltrenner auch nicht spezifiziert ist.

Welches besser spezifizierte, textbasierte Format für tabellarische Daten würde man für derartige Klein-Projekte heute schlau wählen? JSON - gut maschinenlesbar, halbwegs menschenlesbar?

Tim Moritz
Geschrieben von Tim Moritz am 20. Juni 2023 um 10:13

JSON lässt sich wunderbar durch einen beautifier jagen und ist dann auch durchaus gut lesbar, da gibt es online beautifier oder auch cli tools wie jq (was noch deutlich mehr kann mit JSON Daten) https://gnulinux.ch/json-query

Christian Lorenz
Geschrieben von Christian Lorenz am 20. Juni 2023 um 11:13

Moin,

schöner Artikel.

Anmerkung zu: „Angenommen, ihr seid in einer Microsoft-lastigen Büroumgebung beschäftigt. Dort gilt es, einen Export aus einer SQL-Datenbank für andere (wenig technikaffine Abteilungen) aufzubereiten. Beim Export aus der Datenbank entscheidet ihr euch für das CSV-Format und UTF-8 als Zeichenformat. Dann importiert ihr diese Datei in MS-Excel. Herzlichen Glückwunsch; mit einem Klick ist das nicht zu erledigen.“

Ich arbeite in Microsoft Büroumgebungen und dort sollte man zum Import in Office Produkte (am besten immer) den Textimport-Assistenten starten.

„Wenn in Excel eine CSV-Datei geöffnet wird, werden die aktuellen Standardeinstellungen für das Datenformat verwendet, um zu interpretieren, wie die einzelnen Datenspalten importiert werden müssen. Wenn Sie beim Konvertieren von Spalten in unterschiedliche Datenformate ein größeres Maß an Flexibilität wünschen, können Sie den Textimport-Assistenten verwenden.“ Quelle: https://support.microsoft.com/de-de/office/importieren-oder-exportieren-von-textdateien-txt-oder-csv-5250ac4c-663c-47ce-937b-339e391393ba

Gruß Christian