CSV ist eines jener Formate, das niemand liebt, aber alle verwenden. Es existiert seit den 1970ern, ist immer noch das Standard-Exportformat für jede Tabellenkalkulationsanwendung auf dem Planeten und steckt momentan wahrscheinlich irgendwo in Ihrer Datenpipeline. Das Format wirkt trivial einfach — nur durch Kommas getrennte Werte — aber es korrekt zu parsen, ist überraschend fehlerträchtig. Lassen Sie uns durchgehen, wie es wirklich funktioniert, wo es kompliziert wird, und wie man es in Python und JavaScript verarbeitet, ohne sich selbst ein Bein zu stellen.
Was CSV wirklich ist
CSV steht für Comma-Separated Values (kommagetrennte Werte). Eine CSV-Datei ist Klartext — keine Binärkodierung, keine Metadaten, keine Struktur jenseits von Zeilen und Spalten. Jede Zeile ist ein Datensatz, jeder Wert innerhalb einer Zeile wird durch ein Trennzeichen (normalerweise ein Komma) getrennt, und die erste Zeile ist konventionell eine Kopfzeile mit Spaltennamen. So sieht eine echte CSV aus:
order_id,customer,product,quantity,unit_price,shipped
1001,Alice Nguyen,USB-C Hub,2,34.99,true
1002,Bob Martinez,Mechanical Keyboard,1,129.00,false
1003,Alice Nguyen,HDMI Cable,3,12.50,true
1004,Carol Smith,Webcam 1080p,1,79.95,falseDas ist alles — sechs Spalten, vier Datenzeilen und eine Kopfzeile. Keine spitzen Klammern, keine
geschweiften Klammern, keine benötigten Anführungszeichen (noch). Diese Einfachheit ist genau der Grund,
warum CSV fortbesteht: Fast jedes Tool der Welt kann es öffnen, lesen und produzieren. Excel, Google
Sheets, PostgreSQLs COPY-Befehl, pandas, Rs read.csv() — alle CSV
von Haus aus. Der Kompromiss ist, dass das Format fast keine Struktur hat: keine Typen, keine Verschachtelung,
kein Schema. Jeder Wert ist eine Zeichenkette, bis Sie anders entscheiden.
RFC 4180 — Der Standard, der nicht wirklich durchgesetzt wird
Es gibt eine Spezifikation: RFC 4180, veröffentlicht 2005. Sie definiert Dinge wie CRLF-Zeilenenden, doppeltes Anführungszeichen-Escaping und den Umgang mit eingebetteten Kommas. Aber hier ist das Ding — RFC 4180 ist informativ, kein Standard. Es beschreibt, was bereits gängige Praxis war, nicht was vorgeschrieben ist. Niemand ist verpflichtet, es zu befolgen, und in der Praxis hält es kaum jemand genau ein.
Das Ergebnis ist CSV-Dialekt-Chaos. Es gibt Dateien, die LF statt CRLF verwenden, Dateien, wo die erste Zeile eine Kopfzeile sein kann oder nicht, Dateien mit und ohne abschließendem Zeilenumbruch, Dateien mit einem von Excel vorangestelltem UTF-8-BOM. Der Wikipedia-Artikel zu CSV hat eine gute Übersicht über alles, was in der Praxis variiert. Der sicherste Ansatz: Nehmen Sie nichts über eine CSV-Datei an, die Sie nicht selbst produziert haben, und verwenden Sie immer einen richtigen Parser statt naiv auf Kommas zu splitten.
Anführungsregeln: Wenn Kommas in Werten erscheinen
Hier bricht "einfach auf Kommas splitten" zusammen. Was passiert, wenn ein Wert ein Komma enthält? Oder einen Zeilenumbruch? Oder ein doppeltes Anführungszeichen? RFC 4180 — und die meisten Parser in der Praxis — behandeln das, indem das Feld in doppelte Anführungszeichen eingeschlossen wird. Hier sind die vollständigen Regeln:
- Wenn ein Feld ein Komma, einen Zeilenumbruch oder ein doppeltes Anführungszeichen enthält, umschließen Sie das gesamte Feld mit doppelten Anführungszeichen
- Wenn ein Feld ein doppeltes Anführungszeichen enthält, escapen Sie es durch Verdopplung (
"") - Felder in Anführungszeichen können mehrere Zeilen umfassen — der Zeilenumbruch wird Teil des Wertes
- Leerzeichen innerhalb von Anführungszeichen sind bedeutsam und müssen erhalten bleiben
order_id,customer,notes,unit_price
1005,David Lee,"Wants gift wrapping, express shipping",45.00
1006,Emma Brown,"Said: ""please handle with care""",89.99
1007,Frank Wu,"Address:
123 Main St
Apt 4B",15.50In diesem Beispiel: Davids notes enthält ein Komma, daher wird es in Anführungszeichen
gesetzt. Emmas Notiz enthält doppelte Anführungszeichen, die innerhalb der äußeren Anführungszeichen
verdoppelt werden. Franks Adresse umspannt mehrere Zeilen — die Zeilenumbrüche sind Teil des Wertes. Ein
naives line.split(',') in jeder Sprache wird alle drei vollständig zerstören. Deshalb brauchen
Sie einen echten Parser.
split
korrekt tun.Trennzeichen-Varianten: Tabs, Semikolons, Pipes
Trotz des Namens muss CSV keine Kommas verwenden. Mehrere gängige Varianten verwenden verschiedene Trennzeichen, und Sie werden alle in der Praxis begegnen:
- TSV (Tab-getrennte Werte) — verwendet
\tals Trennzeichen. Üblich in der Bioinformatik (BLAST-Ausgabe, VCF-Dateien), Datenbankexporten und überall, wo Werte häufig Kommas enthalten - Semikolon-getrennt — der Standard in Excel für Länder, wo das Komma das Dezimaltrennzeichen ist (Deutschland, Frankreich, die meisten EU-Länder). Wenn Sie jemals eine CSV von einem europäischen Kollegen geöffnet und eine riesige Spalte erhalten haben, ist das der Grund
- Pipe-getrennt — verwendet
|. Üblich in Legacy-Banking- und Versicherungsdatenexporten, wo Tabs von Mainframe-Systemen entfernt werden könnten - Feste Breite — technisch gesehen kein CSV, aber oft in dieselbe Kategorie eingeordnet. Spalten werden auf feste Breiten aufgefüllt statt getrennt
Die meisten CSV-Parser erlauben die explizite Angabe des Trennzeichens. Wenn Sie eine CSV schreiben, die andere verbrauchen werden, dokumentieren Sie Ihr Trennzeichen. Wenn Sie eine lesen, die Sie nicht produziert haben, überprüfen Sie die ersten Zeilen, bevor Sie Annahmen machen. Der CSV-Formatierer kann Ihnen helfen, Dateien mit nicht standardmäßigen Trennzeichen zu untersuchen und neu zu formatieren.
CSV in Python parsen
Die Python-Standardbibliothek enthält das
csv-Modul,
und es ist genuinously gut. Die zwei Klassen, die Sie am häufigsten verwenden werden, sind csv.reader
für Zeilen-als-Liste-Zugriff und csv.DictReader für Zeilen-als-Dict-Zugriff (was fast immer das ist,
was Sie wollen).
import csv
# csv.reader — each row is a list of strings
with open('orders.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
header = next(reader) # consume the header row
for row in reader:
order_id, customer, product, quantity, price, shipped = row
print(f"Order {order_id}: {quantity}x {product} for {customer}")
# csv.DictReader — each row is an OrderedDict keyed by the header
with open('orders.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
for row in reader:
if row['shipped'] == 'false':
print(f"Pending: {row['order_id']} — {row['customer']}")Zwei Dinge, die immer enthalten sein sollten: encoding='utf-8' (oder was die Datei
tatsächlich verwendet) und newline=''. Das Zweite ist kritisch — das csv-Modul
erledigt seine eigene Zeilenumbruchverarbeitung und benötigt die rohen Bytes. Ohne newline=''
können Sie unter Windows extra Leerzeilen erhalten.
Das Schreiben ist mit csv.writer genauso unkompliziert:
import csv
orders = [
{'order_id': 1008, 'customer': 'Grace Kim', 'product': 'Laptop Stand', 'quantity': 1, 'unit_price': 49.99, 'shipped': False},
{'order_id': 1009, 'customer': 'Henry Park', 'product': 'USB-C Hub', 'quantity': 2, 'unit_price': 34.99, 'shipped': True},
]
with open('new_orders.csv', 'w', encoding='utf-8', newline='') as f:
fieldnames = ['order_id', 'customer', 'product', 'quantity', 'unit_price', 'shipped']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(orders)
# To use a different delimiter (e.g. tab-separated)
with open('new_orders.tsv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f, delimiter='\t')
writer.writerow(['order_id', 'customer', 'product'])
writer.writerow([1008, 'Grace Kim', 'Laptop Stand'])Das csv-Modul kümmert sich automatisch um alle Anführungszeichen — wenn ein Feld ein Komma
oder einen Zeilenumbruch enthält, wird es in doppelte Anführungszeichen eingeschlossen, ohne dass Sie
darüber nachdenken müssen. Das ist der ganze Sinn der Verwendung einer Bibliothek.
CSV in JavaScript / Node.js parsen
JavaScript hat keinen integrierten CSV-Parser. Die Versuchung ist, das zu tun:
// ❌ Don't do this — breaks immediately on quoted fields
const rows = csvText.split('\n').map(line => line.split(','));Das schlägt sofort fehl, sobald ein Wert ein Komma, einen Zeilenumbruch in Anführungszeichen oder ein escaptes doppeltes Anführungszeichen enthält. Für alles Reale verwenden Sie eine Bibliothek. PapaParse ist die erste Wahl — es ist schnell, behandelt alle Randfälle, funktioniert sowohl im Browser als auch in Node.js und unterstützt Streaming für große Dateien.
import Papa from 'papaparse';
import fs from 'fs';
// Parse a CSV string
const csvText = fs.readFileSync('orders.csv', 'utf8');
const result = Papa.parse(csvText, {
header: true, // first row becomes object keys
skipEmptyLines: true, // ignore blank lines at end of file
dynamicTyping: true, // converts "true"/"false" to booleans, numbers to numbers
});
console.log(result.data);
// [
// { order_id: 1001, customer: 'Alice Nguyen', product: 'USB-C Hub', quantity: 2, unit_price: 34.99, shipped: true },
// { order_id: 1002, customer: 'Bob Martinez', product: 'Mechanical Keyboard', quantity: 1, unit_price: 129, shipped: false },
// ...
// ]
// Check for parse errors
if (result.errors.length > 0) {
console.error('Parse errors:', result.errors);
}
// Generate CSV from an array of objects
const orders = [
{ order_id: 1008, customer: 'Grace Kim', product: 'Laptop Stand', quantity: 1, unit_price: 49.99 },
{ order_id: 1009, customer: 'Henry Park', product: 'USB-C Hub', quantity: 2, unit_price: 34.99 },
];
const csvOutput = Papa.unparse(orders);
fs.writeFileSync('export.csv', csvOutput, 'utf8');Die dynamicTyping-Option ist nützlich, aber es lohnt sich, sie zu kennen — sie konvertiert
Dinge wie "34.99" automatisch in eine Zahl. Das ist normalerweise das, was Sie wollen, kann aber
überraschen, wenn ein Feld wie order_id in der CSV eine Zahl ist, Sie es aber als String wollten.
Deaktivieren Sie es, wenn Sie eine strikte String-Ausgabe benötigen.
Für schnelle Konvertierungen zwischen CSV und anderen Formaten verarbeitet das CSV zu JSON-Tool die häufigsten Fälle im Browser ohne Code — nützlich für einmalige Datentransformationen. Es gibt auch CSV zu XML, wenn Sie die Daten einem XML-basierten System zuführen müssen.
Häufige Fallstricke, die Sie definitiv treffen werden
Selbst mit einem guten Parser hat CSV einige bekannte Landminen. Hier sind die, die am häufigsten auftreten:
- BOM-Bytes von Excel. Wenn Excel eine CSV als "UTF-8" exportiert, stellt es häufig ein
UTF-8-BOM (
EF BB BFin Hex, oder\ufeffals Zeichen) voran. Das lässt den ersten Spaltenheader wieorder_idstattorder_idaussehen. Öffnen Sie in Python die Datei mitencoding='utf-8-sig'stattutf-8, um es automatisch zu entfernen. PapaParse verarbeitet es transparent. - CRLF vs. LF-Zeilenenden. RFC 4180 spezifiziert CRLF (
\r\n), aber Unix-Tools erzeugen LF (\n) und alte Mac-Dateien verwenden allein CR (\r). Deshalb benötigt Pythonscsv-Modulnewline=''— es behandelt alle drei intern. Wenn Sie rohe Bytes lesen und manuell teilen, müssen Sie\rexplizit entfernen. - Kodierungsprobleme. CSV hat keine Möglichkeit, seine eigene Kodierung zu deklarieren —
anders als HTMLs
<meta charset>oder XMLs<?xml encoding="..."?>. Excel speichert Dateien häufig in Windows-1252 (a.k.a. CP1252) statt UTF-8, was Sonderzeichen verstümmelt. Wenn Sie Zeichen wieéstattésehen, haben Sie eine UTF-8-Datei, die als Latin-1 dekodiert wird, oder umgekehrt. Klären Sie die Kodierung immer außerhalb des Bandes mit dem Dateiersteller. - Zahlen, die wie Daten aussehen. Excel konvertiert beim Öffnen oder Speichern Werte wie
1-2oder03/04stillschweigend in Daten. Wenn Sie Produktcodes oder Versionsnummern exportieren, stellen Sie ihnen in Excel ein einfaches Anführungszeichen voran ('1-2), um das zu verhindern — oder sagen Sie demjenigen, der die Datei erstellt, dies zu tun. - Abschließende Kommas. Einige Exporter geben am Ende jeder Zeile ein Komma aus, das eine phantomhafte leere Spalte erstellt. Ein robuster Parser ignoriert es; ein naives Split erstellt ein zusätzliches leeres String-Element.
Wenn Sie mit einer Datei arbeiten, die seltsam aussieht, kann der CSV-Validator Ihnen schnell sagen, ob die Datei wohlgeformt ist und Kodierungs- oder Strukturprobleme kennzeichnen, bevor Sie versuchen, sie zu verarbeiten.
CSV vs. JSON vs. Excel — Wann was verwenden
Diese drei Formate überlappen sich in der Praxis sehr, aber jedes hat einen klaren Schwerpunkt:
- Verwenden Sie CSV, wenn Sie flache, tabellarische Daten zwischen Systemen verschieben — Datenbankexporte, Analyse-Pipelines, Tabellenkalkulationsimporte, Massendatenladen. Es wird allgemein unterstützt, ist klein in der Größe und lässt sich trivial in git diff-en. Die Einschränkung: Es ist flach. Keine Verschachtelung, keine Typen, keine Beziehungen.
- Verwenden Sie JSON, wenn Daten hierarchisch sind oder Schema wichtig ist. Eine Bestellung mit mehreren Positionen, eine Konfigurationsdatei mit verschachtelten Objekten, eine API-Antwort — diese sind natürlich JSON. CSV würde Sie zwingen, die Daten zu denormalisieren oder eine eigene Verschachtelungskonvention zu erfinden. Die JSON-Spezifikation ist sauber und eindeutig; das Format erhält Typen (Zahlen, Booleans, null, Arrays, Objekte).
- Verwenden Sie Excel (.xlsx), wenn die Ausgabe für Menschen, nicht Maschinen ist. Formatierung, Formeln, mehrere Blätter, Diagramme — wenn ein Geschäftsanwender der endgültige Verbraucher ist, ist Excel oft die richtige Wahl. Verwenden Sie es niemals als Austauschformat zwischen Systemen. Die OOXML-Spezifikation ist enorm und das Format ist über Versionen hinweg fragil.
Es gibt eine praktische Faustregel: Wenn Sie die Daten natürlich in einer Tabellenkalkulation ansehen würden, ist CSV wahrscheinlich in Ordnung. Wenn Sie es in einem Baum oder Code-Editor ansehen würden, verwenden Sie JSON. Wenn Sie es an einen Geschäftsbeteiligten senden, der es filtern und sortieren wird, verwenden Sie Excel.
Zusammenfassung
CSV ist einfach konzipiert und überraschend knifflig in der Praxis. Das Format hat keinen
durchgesetzten Standard, kommt in mehreren Trennzeichen-Varianten und verlässt sich auf Anführungsregeln,
die jeden manuellen Parsing-Versuch brechen. Die Lösung ist immer die gleiche: Verwenden Sie einen echten
Parser (Pythons eingebautes csv-Modul oder PapaParse in JavaScript), geben Sie immer die
Kodierung explizit an und achten Sie auf BOM-Bytes von Excel. Sobald Sie einen zuverlässigen Parser haben,
ist CSV tatsächlich ein großartiges Format — schnell zu erstellen, in jedem Texteditor leicht zu untersuchen
und überall unterstützt. Für die tägliche Arbeit mit CSV-Dateien erledigen die Tools
CSV zu JSON, CSV-Formatierer und
CSV-Validator die häufigen Operationen ohne eine Zeile Code zu schreiben.