4 Punkte von GN⁺ 2025-03-27 | 3 Kommentare | Auf WhatsApp teilen
  • Immer wieder werden „überlegene“ Formate als Ersatz für CSV vorgestellt, doch die meisten beruhen auf verzerrten Vergleichen und übersehen die echten Stärken von CSV
  • Dieser Text will nicht behaupten, dass CSV perfekt ist, sondern seine unterschätzten Vorteile beleuchten
  • Gegen die Haltung, dass es cool wirkt, CSV zu hassen, erinnert er an den wahren Wert von CSV

1. CSV ist extrem einfach

  • Die Definition von CSV steht schon im Namen: „comma-separated values“
  • Zeilen werden durch Zeilenumbrüche, Spalten durch Kommata getrennt
  • Wenn Werte Kommata oder Zeilenumbrüche enthalten, werden sie in Anführungszeichen gesetzt; Anführungszeichen selbst werden als doppelte Anführungszeichen dargestellt
  • Ohne komplexe Spezifikation kann praktisch jeder das Format intuitiv verstehen und verwenden
  • Für korrektes Parsing ist dennoch weiterhin ein dedizierter CSV-Parser nötig

2. CSV ist eine kollektive Idee

  • Es hat keinen Eigentümer und ist nicht privatisiert
  • Es gibt RFC 4180, doch die meisten sehen es eher als Referenz
  • Es ist ein freies Format auf Basis gemeinsamer Regeln, die Entwickler weltweit implizit teilen

3. CSV ist Text

  • Wie JSON, YAML oder XML ist es ein menschenlesbares reines Textformat
  • Es lässt sich mit jedem Texteditor öffnen, und der Inhalt kann auch ohne spezielle Tools geprüft werden
  • Auch die Wahl der Kodierung ist frei

4. CSV ist für Streaming optimiert

  • Weil es zeilenweise gelesen wird, ist der Speicherverbrauch sehr gering
  • Schon mit einfachem Code lassen sich mehrere Gigabyte Daten mit nur wenigen KB Speicher verarbeiten
  • Spaltenorientierte Formate wie Parquet eignen sich schlecht für Streaming und erfordern komplexes Buffering
  • Der Nachteil: Selbst wenn man nur bestimmte Spalten sehen will, muss man immer die ganze Zeile lesen

5. CSV lässt sich leicht anhängen

  • Es ist sehr einfach, eine Datei im Append-Modus (a+) zu öffnen und neue Zeilen ans Ende anzufügen
  • Bei spaltenorientierten Formaten wie Parquet ist das Hinzufügen von Zeilen dagegen ineffizient und kompliziert

6. CSV unterstützt dynamische Typen

  • Da es keine festen Typen gibt, lassen sich Daten flexibel interpretieren
  • Beispiel: JavaScript kann 64-Bit-Ganzzahlen nicht sauber darstellen, CSV lässt sich jedoch ohne solche Einschränkungen verwenden
  • Das ist ein Vorteil bei Sprachkompatibilität und Flexibilität
  • Falsche Interpretation kann aber zu Fehlern führen → bei der Nutzung ist Vorsicht nötig
  • Wenn hohe Performance gefragt ist, kann man Text auch ohne Decoding direkt auf Binärebene verarbeiten

7. CSV ist kompakt

  • Der Header steht nur am Anfang der Datei, daher gibt es kaum Wiederholungen im Format
  • JSON und XML haben durch wiederholte Schlüssel viel Overhead
  • Auch die Darstellung von Zeichenketten ist bereits kompakt, und der Overhead des Formats selbst (Kommata, Anführungszeichen usw.) ist sehr gering

8. Auch umgedrehtes CSV ist weiterhin gültig

  • CSV bleibt selbst dann gültiges CSV, wenn man es auf Byte-Ebene umdreht
  • Das liegt an der Escape-Methode mit doppelten Anführungszeichen, die eine palindromische Escape-Form darstellt
  • Dadurch lässt sich das Ende einer CSV-Datei sehr effizient lesen
  • Beispiel: Wenn ein unterbrochener Prozess fortgesetzt werden soll, kann man nur die letzten paar Zeilen der Datei lesen und von dort neu starten

9. Excel hasst CSV

  • Wenn Excel ein Format unbequem findet, ist das vielleicht sogar ein Zeichen dafür, dass man auf dem richtigen Weg ist

3 Kommentare

 
ng0301 2025-03-29

Einfach ist am besten!

 
ethanhur 2025-03-27

Schlechter ist besser!

 
GN⁺ 2025-03-27
Hacker-News-Kommentare
  • Ich mag CSV- und INI-Dateien, weil sie einfach und textbasiert sind, keine in das Format eingebetteten Typen haben und nur aus Strings bestehen

    • Sie haben den Nachteil, dass es keinen offiziellen Standard gibt, aber sie erfüllen ihren Zweck gut
    • Ich habe mir Kritik an INI aus der Perspektive von TOML als Lesezeichen gespeichert
    • Ich denke, dass die erste Zeile der TOML-Kritik auch auf CSV zutrifft: ein Zusammenschluss vieler Dialekte
  • CSV ist elegant, hat aber einen fatalen Makel – Anführungszeichen haben einen „nichtlokalen“ Effekt

    • Zum Beispiel kann ein einzelnes Anführungszeichen bei Byte 1 die Bedeutung eines Kommas bei Byte 1000000 verändern
    • Daraus ergeben sich zwei unangenehme Folgen
      • Die Parallelisierung der CSV-Verarbeitung ist schwierig
      • Datenbeschädigungen beeinträchtigen die Lesbarkeit einer Datei stark (ein fehlendes oder zusätzliches Anführungszeichen kann alles ruinieren)
    • Deshalb bevorzuge ich heutzutage bei der Serialisierung einfacher Tabellendaten statt CSV ein einfaches Escaping
  • Das Beste an CSV ist, dass jeder in 30 Minuten einen Parser schreiben kann

    • Daten aus den frühen 90ern lassen sich problemlos in moderne Web-Services importieren
    • Das Schlechteste an CSV ist, dass jeder in 30 Minuten einen Parser schreiben kann
    • Es kommt leicht zu fehlerhaften Implementierungen, fehlerhaften Daten und seltsamem undefiniertem Verhalten
    • JSON und YAML haben ähnliche Probleme
    • XML ist etwas unschön, scheint aber am robustesten zu sein
  • Wer CSV mag, wurde vermutlich noch nie gebeten, in einem Unternehmensumfeld CSV-Injection abzusichern

    • Im Web gibt es dazu nur wenige gute Ressourcen
    • Die beste Ressource ist <a href="https://georgemauer.net/2017/10/07/csv-injection.html" rel="nofollow">hier</a>
  • Es gibt viele Gründe, warum ich CSV mag

    • Man kann ein Programm in C schreiben und verschiedenste Dinge direkt als CSV ausgeben
    • Man kann einfache Middleware schreiben, die sich aus fast jeder Datenbank oder jedem allgemeinen „Ding“ leicht in CSV umwandeln lässt
    • Man kann CSV in Excel laden und alles damit machen, was man möchte
    • Ich mag auch INI-Dateien. Man kann sie direkt im Editor bearbeiten
    • Ich wünschte mir aber trotzdem eine allgemeine Gliederung/Struktur
  • Ich entwickle derzeit eine Raspberry-Pi-basierte Lösung

    • Die erste Implementierung nutzte eine SQLite-Datenbank, die aber wenige Tage nach Stromzyklen beschädigt war
    • Ich habe mir Parquet-Dateien angesehen, aber sie sind für Append-only-Workloads nicht besonders geeignet
    • Ich habe eine Methode implementiert, bei der Ereignisse in eine IPC-Datei geschrieben und periodisch in eine Parquet-Datei „geflusht“ werden
    • Das funktioniert und ist effizient, lässt sich aber nicht leicht korrekt implementieren
    • Für durchschnittliche Entwickler sind CSV (oder JSONL) immer noch am besten
  • Das Unspaßige an CSV ist, dass schnell geschriebene Parser und Serializer immer wieder denselben häufigen Fehler machen und Anführungszeichen falsch behandeln

    • Ich war CSV lange gegenüber vorsichtig, aber das änderte sich, als ich Python lernte und das hervorragende csv-Standardbibliotheksmodul verwendete
  • Wenn das hier wirklich ein Liebesbrief wäre, wäre er im CSV-Format geschrieben

  • Die Einwände gegen JSON sind nicht besonders überzeugend

    • Es ist nicht nötig, jedem Feld einen Namen hinzuzufügen
    • Verglichen mit CSV ist JSON etwas größer, aber die Klammern drücken die Fähigkeit aus, dass etwas einfach oder komplex sein kann
    • Weil CSV so einfach ist, werden oft keine Parsing-/Encoding-Bibliotheken verwendet
    • Ein JSON-Parser gibt immer die erwarteten Werte aus, und die Sprache verwendet wahrscheinlich einen sehr effizienten SIMD-basierten Parser
    • Es gibt auch Standardisierungsprobleme. Ob eine CSV-Datei Kommas, Leerzeichen, Semikolons oder Pipes verwendet, ob sie CR, LF oder CRLF nutzt, ob Anführungszeichen escaped werden können usw.
    • JSON hat diese Probleme nicht
    • JSON hat Typen. Sechs Typen sind besser als gar keine
    • JSON ist nicht perfekt, aber im Allgemeinen besser als CSV
  • Als jemand, der moderne Formate mag, verwende ich im Zweifel CSV oder JSONL

    • Da es größtenteils Klartext ist, lässt es sich leicht mit grep durchsuchen und streamen
    • Die meisten in dem Dokument aufgeführten Funktionen gelten auch für JSONL
    • Es lässt sich gut mit gzip oder zstd komprimieren
    • Komprimierung nimmt Klartext zwar einige Vorteile, aber ripgrep kann auch komprimierte Dateien durchsuchen
    • Ein weiterer Vorteil von JSONL ist, dass es sich leicht in kleinere Dateien aufteilen lässt