Zum Hauptinhalt springen

CSV-Regeln nach RFC 4180

RFC 4180 definiert CSV präzise: Datensätze getrennt durch CRLF, Felder getrennt durch Kommas, doppelte Anführungszeichen um jedes Feld, das ein Komma, ein Anführungszeichen oder einen Zeilenumbruch enthält – eingebettete Anführungszeichen werden als "" verdoppelt. Die Kopfzeile ist optional, das Trennzeichen ist das Komma, und der MIME-Typ ist text/csv. Die meisten realen Dateien halten sich nur lose daran.

Nur lokal

CSV-Regeln nach RFC 4180 erklärt

CSV ist älter als seine Spezifikation. Dateien mit kommagetrennten Werten wurden schon jahrzehntelang ausgetauscht, als RFC 4180 im Oktober 2005 als Informationsdokument erschien – kein neuer Entwurf, sondern eine sorgfältige Beschreibung dessen, was die Welt bereits praktizierte, niedergeschrieben, damit Parser sich darauf einigen konnten. Dieser Ursprung erklärt sowohl seine Kürze als auch den häufigsten Einwand: Der Standard beschreibt die Konvention, und die Konvention ist älter als der Standard.

Die Regeln selbst sind kurz. Eine Datei ist eine Folge von Datensätzen; Datensätze werden durch CRLF getrennt; Felder werden durch Kommas getrennt; und ein Feld, das ein Komma, ein doppeltes Anführungszeichen oder einen Zeilenumbruch enthält, muss in doppelte Anführungszeichen eingeschlossen werden, wobei interne Anführungszeichen verdoppelt geschrieben werden. Alles andere – Zeichencodierungen, Kopfzeilen, Zeilen mit unterschiedlicher Feldzahl – macht der RFC entweder optional oder überlässt es der Praxis; genau deshalb weichen reale Dateien ab.

Dieser Leitfaden geht die Grammatik Regel für Regel durch, mit kopierbaren Beispielen, markiert die Stellen, an denen die Spezifikation „darf“ sagt, und katalogisiert die Abweichungen, die Ihnen in der Praxis tatsächlich begegnen: Byte-Order-Marks, Semikolons als Trennzeichen, Unix-Zeilenenden. Die im Text verlinkten Konverter implementieren die vollständige Grammatik – Felder in Anführungszeichen, eingebettete Zeilenumbrüche, alles – vollständig in Ihrem Browser.

Eine Grammatik sieht man am leichtesten in der Ausgabe eines Parsers: Fügen Sie eine Datei mit viel Quoting in den CSV-zu-JSON-Konverter ein, und jede der obigen Regeln wird zu einem Feld in dem JSON, das er erzeugt – lokal geparst, nichts hochgeladen.

Auf der Erzeuger-Seite übernimmt der JSON-zu-CSV-Konverter das Quoting exakt nach den Vorgaben von RFC 4180, sodass Round-Trips durch Tabellenkalkulationen Kommas und Zeilenumbrüche in Ihren Daten überstehen.

Die Grammatik: Datensätze, Felder, CRLF

Die Grammatik von RFC 4180 passt in einen Absatz. Eine Datei besteht aus Datensätzen, jeder Datensatz eine Folge von Feldern, getrennt durch Kommas; Datensätze werden durch CRLF getrennt – die zwei Bytes 0x0D 0x0A, nicht das nackte LF Unix-typischer Werkzeuge – und der letzte Datensatz endet mit einem abschließenden CRLF oder eben nicht. Felder stehen in Anführungszeichen oder nicht: Quoting ist eine Frage der Umstände, kein Stil. Der ABNF-Abriss lautet file = [header CRLF] record *(CRLF record); record = field *(comma field) – beachten Sie die optionale Kopfzeile innerhalb der eckigen Klammern.

Eine minimale konforme Datei

id,name,score
1,Ada,99
2,Grace,98

Dieselbe Datei als Datensätze

Datensatz 1: id=1, name=Ada,   score=99
Datensatz 2: id=2, name=Grace, score=98

(jeder Datensatz endet mit den zwei Bytes CRLF;
beim letzten dürfen sie regelkonform fehlen)

Quoting: Das doppelte Anführungszeichen ist das gesamte Escape-System

Ein Feld steht in doppelten Anführungszeichen, wenn es muss, und die einzige Möglichkeit, ein doppeltes Anführungszeichen in ein solches Feld zu bekommen, ist es zu verdoppeln – "" innerhalb eines Felds in Anführungszeichen steht für genau ein literales Anführungszeichen. Das ist der gesamte Escape-Mechanismus: keine Backslashes, keine benannten Entities, kein zweites Anführungszeichen. Einfache Anführungszeichen sind gewöhnliche Daten, und ein einzelnes Leerzeichen nach einem Komma gehört zum nächsten Feld – die Spezifikation sagt ausdrücklich, dass Leerzeichen erhalten bleiben und nicht abgeschnitten werden dürfen.

Der gewünschte WertDas RFC-4180-FeldWarum
plainplainAnführungszeichen optional – die bloße Form ist der Standard
with, comma"with, comma"Felder mit Kommas müssen in Anführungszeichen stehen
with " quote"with "" quote"Eingebettete Anführungszeichen werden innerhalb von Anführungszeichen verdoppelt
with newline"with newline"Felder in Anführungszeichen dürfen Zeilenumbrüche enthalten
padded padded Leerzeichen sind Daten – Quoting optional, Abschneiden verboten

Ein Datensatz, alle Quoting-Regeln auf einmal

year,quote,note
1962,"she said ""look, no hands""","multi-word, no problem"

Geparste Felder

year   → 1962
quote  → she said "look, no hands"
note   → multi-word, no problem

Zeilenumbrüche und Kommas innerhalb von Feldern

Weil Felder in Anführungszeichen Zeilenumbrüche enthalten dürfen, ist eine CSV-Zeile nicht dasselbe wie ein Datensatz: Jedes naive Aufteilen an \n zerstört jede Datei mit mehrzeiligen Feldern – deshalb scheitern Adressblöcke, Notizspalten und JSON-in-CSV-Nutzdaten an naiven Importern. Ein konformer Parser ist eine kleine State Machine: Innerhalb der Anführungszeichen sind Kommas und Zeilenumbrüche Daten, außerhalb sind es Trennzeichen. Korrekt lässt sich das nicht allein mit split() schreiben.

Dieselbe State Machine entscheidet auch die Grenzfälle um das doppelte Anführungszeichen: ein Anführungszeichen mitten im Wert, ein nicht abgeschlossenes Anführungszeichen am Dateiende, verdoppelte Anführungszeichen ganz am Ende eines Felds. Genau für diese Fälle wurden die wenigen Regeln von RFC 4180 geschrieben, und genau an ihnen widersprechen sich handgeschriebene Parser – die Quelle der meisten Meldungen nach dem Muster „funktioniert in Excel, bricht im Importer“.

Zwei Datensätze, drei physische Zeilen

name,address
"Ada","12 St James Square,
London"
"Grace","1 Loop Rd"

Was ein konformer Parser liefert

Datensatz 1: Ada | 12 St James Square,
London
Datensatz 2: Grace | 1 Loop Rd

(das Komma in der Adresse gehört zu den Daten,
ebenso das CRLF innerhalb der Anführungszeichen)

CRLF, die optionale Kopfzeile und text/csv

Drei Details sind von der Spezifikation festgelegt und werden doch routinemäßig anders angenommen. Datensätze enden mit CRLF – auch wenn der letzte Datensatz darauf verzichten darf und jeder Parser, den Sie täglich benutzen, nacktes LF akzeptiert. Der erste Datensatz kann Spaltennamen enthalten, aber die Grammatik behandelt ihn als optional: Eine Kopfzeile ist eine Konvention, die das Format unterstützt, keine Struktur, die es verlangt – Werkzeuge müssen es also gesagt bekommen oder selbst raten, ob die erste Zeile Daten sind. Und der registrierte MIME-Typ ist text/csv – von RFC 4180 selbst registriert, wobei die Charset-Parameter dem Absender überlassen bleiben.

Eine weitere Grenze zieht der RFC deutlich: Das Trennzeichen ist das Komma. Semikolongetrennte Dateien sind eine Locale-Konvention von Tabellenkalkulationen – verbreitet, wo das Dezimalkomma Standard ist –, keine Variante, die der Standard anerkennt. Ein konformer Schreiber rät nie, und ein konformer Parser findet das Trennzeichen entweder selbst heraus oder bekommt es gesagt, aber die Datei selbst trägt keine Markierung dafür, welcher Konvention sie folgt.

Wo reale Dateien vom Standard abweichen

Reales CSV ist älter als der RFC; Abweichung ist also die Norm, nicht die Ausnahme. Fünf Abweichungen erklären fast jeden Vorfall der Art „diese CSV lässt sich nicht parsen“:

Gute Werkzeuge machen diese Abweichungen sichtbar, statt stillschweigend zu raten. Wenn eine Datei wichtig ist – Rechnungen, Finanzimporte, alles, was ein Prüfer lesen könnte –, gleichen Sie sie mit der obigen Grammatik ab und beheben Sie die Abweichung an der Quelle, statt jedem nachgelagerten Parser dieselbe Ausnahme beizubringen.

AbweichungTypische UrsacheWas bricht
UTF-8-BOM vor der Kopfzeile„CSV UTF-8“-Exporte aus TabellenkalkulationenDer erste Spaltenname erhält drei unsichtbare Bytes
Nur LF oder gemischte ZeilenendenUnix-Werkzeuge; handeditierte DateienStrenge CRLF-Splitter verlesen Datensatzgrenzen
Semikolon oder Tab als TrennzeichenNicht-englische Locales in TabellenkalkulationenNur-Komma-Parser führen Spalten zusammen
Uneinheitliches QuotingTeilexporte; manuelle BearbeitungenParser, die gleichmäßiges Quoting annehmen, verlesen Werte
Zeilen mit unterschiedlicher FeldzahlManuelle Bearbeitungen; nachlässige VerknüpfungenFalsche Annahmen über die Feldzahl; Spaltenverschiebung nachgelagert

CSV schreiben, das Round-Trips übersteht

Die Checkliste des zuverlässigen Erzeugers folgt direkt aus der Grammatik: durchgängig quoten – jedes Feld, oder genau die Felder, die die Regeln verlangen; beides ist konform, aber einheitliches Quoting lässt sich beim erneuten Einlesen sicherer verarbeiten –, dazu CRLF ausgeben, die Kopfzeile schreiben und als UTF-8 kodieren – notfalls mit einem BOM, der manchmal der Preis dafür ist, dass eine Tabellenkalkulation die Datei erkennt. Prüfen Sie alles Wichtige im Round-Trip: Parsen Sie die Datei, die Sie gerade geschrieben haben, bestätigen Sie, dass jedes Feld den Quelldaten entspricht, und geben Sie sie erst dann weiter. Der wiederkehrende Fehler ist immer derselbe – ein Wert, der das Trennzeichen enthält und den der Schreiber nie gequoted hat.

Häufig gestellte Fragen

Wird meine CSV hochgeladen, wenn ich die hier verlinkten Konverter benutze?

Nein – die CSV-zu-JSON- und JSON-zu-CSV-Werkzeuge auf dieser Website parsen und erzeugen vollständig in Ihrem Browser: Es gibt keinen Upload-Schritt, keine serverseitige Kopie, und das Network-Panel bleibt leer, solange sie laufen. Die Content-Security-Policy der Website blockiert außerdem ausgehende Verbindungen, sodass Kundendaten, die aus einer Tabellenkalkulation eingefügt wurden, den Tab nicht verlassen können.

Ist die Kopfzeile in einer CSV-Datei erforderlich?

Nach dem Standard nicht: Die Grammatik von RFC 4180 macht den ersten Datensatz optional, genau wie jeden anderen – eine Kopfzeile ist eine erlaubte Konvention, keine vorgeschriebene Struktur. In der Praxis verhalten sich die verarbeitenden Werkzeuge unterschiedlich: Datenbank-Importer verlangen oft, dass Sie angeben, ob die erste Zeile Daten oder Namen enthält, während Tabellenkalkulationen einfach annehmen, dass eine Kopfzeile existiert.

Warum verwendet meine CSV-Datei Semikolons statt Kommas?

Das ist eine Locale-Konvention von Tabellenkalkulationen, kein anderer Standard: Locales, die das Komma als Dezimaltrennzeichen verwenden, haben das Semikolon übernommen, damit Zahlen wie 3,14 nicht mit den Feldtrennern kollidieren. RFC 4180 legt das Trennzeichen als Komma fest, also müssen Werkzeuge die Datei selbst untersuchen, eine Einstellung anbieten – oder falsch parsen, weshalb ein Export lokal sauber öffnet und nachgelagert bricht.

Wie setzt man ein Anführungszeichen in ein CSV-Feld?

Verdoppeln Sie es, innerhalb eines Felds in Anführungszeichen: Der Wert say "hi" wird in der Datei zu "say ""hi""" – das innere Anführungszeichen verdoppelt sich zum Paar, und wo das verdoppelte Paar auf das schließende Anführungszeichen trifft, stehen drei hintereinander. Verdoppeln ist der einzige Escape-Mechanismus des Formats – keine Backslashes, keine Entities. Ein Feld ohne Anführungszeichen darf per Definition gar kein Anführungszeichen enthalten, und Parser sind sich uneinig, wie sie darüber hinwegsehen wollen; die portable Form setzt das Feld daher immer in Anführungszeichen und verdoppelt seine inneren Anführungszeichen.

Warum erstreckt sich ein CSV-Datensatz manchmal über mehrere Zeilen?

Weil Felder in Anführungszeichen Zeilenumbrüche enthalten dürfen, sind Datensätze und physische Zeilen unterschiedliche Dinge. Eine dreizeilige Adresse in einem Feld lässt einen einzelnen Datensatz über drei Zeilen laufen, und jedes Aufteilen, das \n als Datensatzgrenze behandelt, zerstört die Datei ab diesem Punkt. Konforme Parser verfolgen, ob sie sich innerhalb von Anführungszeichen befinden – eine kleine State Machine, nicht split().

Welche Zeilenenden verlangt CSV tatsächlich?

RFC 4180 schreibt CRLF zwischen Datensätzen vor – beide Bytes, 0x0D 0x0A –, wobei der letzte Datensatz sie weglassen darf. Die reale Welt ist großzügiger: Unix-Werkzeuge geben nacktes LF aus, gemischte Zeilenenden tauchen in handeditierten Dateien auf, und die meisten Parser akzeptieren alle drei. Schreiber, die mit Tabellenkalkulationen zusammenarbeiten müssen, sollten CRLF ausgeben; Leser sollten alles andere tolerieren.

Wo kann ich die hier zitierten Standards nachlesen?

  • RFC 4180 — Gemeinsames Format und MIME-Typ für CSV-Dateien (kommagetrennte Werte)