Die meisten „kaputten“ CSV-Dateien sind gar nicht kaputt. Eine CSV ist eine Textdatei, und Textdateien verrotten selten. Fast immer wurde die Datei mit einer Annahme geschrieben und wird mit einer anderen gelesen: ein anderes Trennzeichen, eine andere Kodierung, eine Anführungszeichen-Regel, die der Export falsch umgesetzt hat.
Erst die Diagnose, dann die Reparatur. Das Symptom verrät, welche von sechs Ursachen vorliegt, und jede hat eine eigene Lösung.
Die schnelle Antwort
Sieh dir zuerst die rohen Bytes an, nicht die Datei in einer Tabellenkalkulation. Die versteckt nämlich die Beweise:
head -5 broken.csv # the actual separators and quotes
file -I broken.csv # the real encoding
wc -l broken.csv # how many lines it thinks there are
Ordne dann das Symptom zu:
| Symptom | Ursache | Lösung |
|---|---|---|
| Alles in einer Spalte | Falsches Trennzeichen | Neu öffnen und es angeben |
é, ’, ü | UTF-8 als Latin-1 gelesen | Als UTF-8 neu öffnen |
 klebt an der ersten Kopfzeile | Byte Order Mark | BOM entfernen |
| Zeilen brechen mitten im Datensatz um | Zeilenumbruch in einem Feld | Anführungszeichen korrigieren |
| Spaltenanzahl driftet ab Zeile N | Ein nicht maskiertes Anführungszeichen | Zeile N suchen und reparieren |
| Datei endet mitten in der Zeile | Abgebrochener Schreibvorgang | Neu exportieren |
1. Alles landet in einer Spalte
Mit Abstand der häufigste Fall, und nie liegt es an der Datei.
In weiten Teilen Europas werden Semikolons verwendet, weil dort das Komma das Dezimaltrennzeichen ist. Viele Exporte mit der Endung .csv sind außerdem in Wahrheit tabulatorgetrennt. head -5 zeigt dir in einer Sekunde, was vorliegt.
Die Lösung: Sag dem Leseprogramm, welches Trennzeichen gilt, statt es per Suchen und Ersetzen auszutauschen. Wer Semikolons durch Kommas ersetzt, erwischt auch die innerhalb von Werten in Anführungszeichen, und schon ist die Datei wirklich kaputt.
- Excel: Nicht doppelklicken. Daten → Aus Text/CSV, dann in der Vorschau das Trennzeichen wählen.
- Google Sheets: Datei → Importieren → Benutzerdefiniertes Trennzeichen.
- Kommandozeile:
duckdb -c "SELECT * FROM read_csv('broken.csv', delim=';')" - Auf dem Smartphone: eine App, mit der du eine Datei mit festen Einstellungen erneut öffnen kannst, statt einer, die einmal rät und dann aufgibt.
Erkennt Trennzeichen, Kopfzeilen und Kodierungen automatisch und, das ist hier der entscheidende Punkt, lässt dich die Datei mit eigenen Einstellungen neu öffnen, wenn die Vermutung falsch war.
Was es kann2. Mojibake: é statt é
Der Klassiker unter den Kodierungsfehlern. Die Datei ist UTF-8, und etwas hat sie als Latin-1 oder Windows-1252 gelesen. Die Bytes sind intakt, nur die Interpretation stimmt nicht.
file -I broken.csv
# broken.csv: text/plain; charset=utf-8
Die Lösung: Neu öffnen und UTF-8 angeben. Im Importdialog von Excel gibt es dafür das Dropdown Dateiursprung. Wähle 65001: Unicode (UTF-8). Auf der Kommandozeile:
iconv -f WINDOWS-1252 -t UTF-8 broken.csv > fixed.csv
Achte auf die Richtung. Ist die Datei tatsächlich Windows-1252 (ältere Systeme, manche ERP-Exporte), wandelt dieser Befehl sie um. Ist sie aber bereits UTF-8 und wird nur falsch angezeigt, macht die Umwandlung alles schlimmer: du würdest das Mojibake selbst kodieren. Prüfe mit file -I, bevor du etwas ausführst.
3. order_id im ersten Spaltennamen
Eine UTF-8-Byte-Order-Mark: drei unsichtbare Bytes am Dateianfang, geschrieben von Excel und von vielen Windows-Werkzeugen. Sie stört den Abgleich der Kopfzeilen in Skripten und erscheint in einfachen Parsern als Zeichenmüll.
sed -i '' '1s/^\xEF\xBB\xBF//' broken.csv # macOS
sed -i '1s/^\xEF\xBB\xBF//' broken.csv # Linux
Entferne sie nur, wenn ein nachgelagertes Programm daran scheitert. Excel will die BOM nämlich haben. Daran erkennt Excel beim Doppelklick, dass die CSV UTF-8 ist, und wenn du sie entfernst, bekommt der Kollege, dem du die Datei schickst, kaputte Umlaute.
4. Zeilen sind in der Mitte geteilt
Du hast 10.000 Zeilen erwartet und 10.340 bekommen, mit Bruchstücken dort, wo Adressen stehen sollten. Irgendwo steckt ein echter Zeilenumbruch in einem Feld: in einer Adresse, einem Kommentarfeld, einem eingefügten Absatz.
Das ist gültiges CSV, wenn das Feld in Anführungszeichen steht:
id,name,notes
1,"Alice","Called back.
Wants a refund."
RFC 4180 erlaubt das, und jeder ordentliche Parser kommt damit klar. Der Bruch entsteht, wenn ein Werkzeug an Zeilenumbrüchen trennt, bevor es an Anführungszeichen denkt. Das trifft auf die meisten Shell-Einzeiler zu, auf einige Tabellen-Importer und auf viel selbstgeschriebenen Code.
Die Lösung liegt meistens beim Leseprogramm, nicht bei der Datei. Nimm einen Parser, der Anführungszeichen versteht: DuckDB, das csv-Modul von Python, csvkit oder einen echten Tabellen-Import. Steht das Feld tatsächlich nicht in Anführungszeichen, ist der Export fehlerhaft, und ein neuer Export geht schneller als die Reparatur.
So prüfst du, welcher Fall vorliegt:
csvclean -n broken.csv # reports rows with the wrong field count
5. Alles nach Zeile 4.812 ist falsch
Die Spaltenanzahl driftet ab einer bestimmten Stelle und fängt sich nie wieder. Das ist ein einziges nicht maskiertes Anführungszeichen, und alles danach wird innerhalb eines Strings gelesen, der nie endet.
id,product,price
1,"6"" pipe",4.50
Dieses 6" hätte als 6"" geschrieben werden müssen. Stattdessen sieht der Parser den Wert bei 6 enden, dann öffnet ein einzelnes " einen neuen, und der Rest der Datei liegt darin.
So findest du die Stelle:
csvclean -n broken.csv
awk -F',' 'NF != 3 {print NR": "$0}' broken.csv # rough, ignores quoting
csvclean ist die zuverlässige Variante. Die awk-Zeile ist eine schnelle Näherung für Dateien ohne Kommas in Anführungszeichen. Hast du die Zeilennummer, korrigiere genau diese Zeile von Hand: Entweder verdoppelst du das innere Anführungszeichen, oder du ersetzt es durch in. und machen weiter.
Auf dem Smartphone ist das mühsam, wenn die App nicht zu einer Zeile springen und eine einzelne Zelle bearbeiten kann:
Öffnet die Datei komplett und lässt dich darin suchen. So findest du die Zeile, in der die Struktur kippt, bevor du entscheidest, ob du reparierst oder neu exportieren.
Was es kann6. Die Datei hört einfach auf
Die letzte Zeile ist ein halber Datensatz, oder die Dateigröße ist verdächtig rund. Das Schreiben wurde unterbrochen, oder der Download.
tail -3 broken.csv
Hier gibt es nichts zu reparieren. Die Daten wurden nie geschrieben. Lösche die unvollständige letzte Zeile und nimm den Verlust hin, oder exportiere neu. Bei einem Download vergleichst du Content-Length mit der tatsächlichen Größe, bevor du der Datei die Schuld gibst.
Die Reparaturregeln
Vier Gewohnheiten, die die meisten dieser Probleme zur Nebensache machen:
- Arbeite an einer Kopie.
cp broken.csv broken.backup.csv. Jede Lösung auf dieser Seite ist eine Vermutung, bis sie geprüft ist, und eine Vermutung, die sich nicht rückgängig machen lässt, ist ein schlechter Tausch. - Erst das Leseprogramm, dann die Datei. Die meisten Symptome hier sind Fehlkonfigurationen. Wer die Daten umschreibt, um einen falsch eingestellten Parser zufriedenzustellen, hat danach zwei Probleme.
- Trennzeichen nie per Suchen und Ersetzen ändern. Es trifft auch die Zeichen in Werten mit Anführungszeichen und macht aus einer lesbaren Datei eine beschädigte.
- Zähle die Zeilen vorher und nachher. Bei jeder Reparatur. Hat sich die Zahl ungewollt geändert, hat die Reparatur etwas zerstört.
Wann du aufgeben und neu exportieren solltest
Sind mehr als eine Handvoll Zeilen strukturell falsch, hör auf zu reparieren. Ein fehlerhafter Export bedeutet meist, dass der Exporter einen Fehler bei den Anführungszeichen hat, und jede Zeile, die er erzeugt, ist verdächtig, auch die, die gerade in Ordnung aussehen. Fordere die Datei erneut an, und zwar mit Anführungszeichen.