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.
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 Wert | Das RFC-4180-Feld | Warum |
|---|---|---|
| plain | plain | Anfü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.
| Abweichung | Typische Ursache | Was bricht |
|---|---|---|
| UTF-8-BOM vor der Kopfzeile | „CSV UTF-8“-Exporte aus Tabellenkalkulationen | Der erste Spaltenname erhält drei unsichtbare Bytes |
| Nur LF oder gemischte Zeilenenden | Unix-Werkzeuge; handeditierte Dateien | Strenge CRLF-Splitter verlesen Datensatzgrenzen |
| Semikolon oder Tab als Trennzeichen | Nicht-englische Locales in Tabellenkalkulationen | Nur-Komma-Parser führen Spalten zusammen |
| Uneinheitliches Quoting | Teilexporte; manuelle Bearbeitungen | Parser, die gleichmäßiges Quoting annehmen, verlesen Werte |
| Zeilen mit unterschiedlicher Feldzahl | Manuelle Bearbeitungen; nachlässige Verknüpfungen | Falsche 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)
Welche verwandten Tools sollten Sie als Nächstes nutzen?
- CSV in JSON umwandelnTabellen-Export in Datensätze umwandeln, Anführungszeichen inklusiveÖffnen
- JSON in CSV umwandelnDatensätze in eine Tabelle umwandeln, Verschachtelung inklusiveÖffnen
- Was ist JSONLeitfaden in verständlicher SpracheÖffnen
- JSON-Syntax-SpickzettelLeitfaden in verständlicher SpracheÖffnen
- JSON-ToolsJSON-Dokumente vergleichen, formatieren, validieren und erkunden.Öffnen
- JSON validierenSyntax prüfen mit exakter Zeile und Spalte, per Klick reparierenÖffnen