mygems

CSV-Datei reparieren: kaputte oder fehlerhafte CSV beheben

Alles in einer Spalte, Anführungszeichen, geteilte Zeilen, Zeichensalat: So findest du heraus, was an deiner CSV wirklich falsch ist, und reparierst sie.

Von uos ·

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:

SymptomUrsacheLösung
Alles in einer SpalteFalsches TrennzeichenNeu öffnen und es angeben
é, ’, üUTF-8 als Latin-1 gelesenAls UTF-8 neu öffnen
 klebt an der ersten KopfzeileByte Order MarkBOM entfernen
Zeilen brechen mitten im Datensatz umZeilenumbruch in einem FeldAnführungszeichen korrigieren
Spaltenanzahl driftet ab Zeile NEin nicht maskiertes AnführungszeichenZeile N suchen und reparieren
Datei endet mitten in der ZeileAbgebrochener SchreibvorgangNeu 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.
CSV Editor - Smart CSViPhone & iPad

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 kann

2. 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:

CSV File Viewer - Smart CSViPhone & iPad · Android

Ö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 kann

6. 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Fragen

Warum erscheint meine ganze CSV in einer Spalte?
Die Datei verwendet ein anderes Trennzeichen, als das Leseprogramm angenommen hat. Semikolons sind in weiten Teilen Europas üblich, weil dort das Komma das Dezimaltrennzeichen ist, und tabulatorgetrennte Dateien tragen erstaunlich oft die Endung .csv. Führe head -5 auf der Datei aus, um das echte Trennzeichen zu sehen, und öffne sie dann mit diesem Trennzeichen neu, statt Zeichen zu ersetzen.
Wie behebe ich seltsame Zeichen wie é in einer CSV?
Das ist ein Kodierungsfehler: Die Datei ist UTF-8, und etwas hat sie als Latin-1 oder Windows-1252 gelesen. Die Bytes sind in Ordnung. Prüfe die tatsächliche Kodierung mit `file -I` und öffne die Datei dann mit UTF-8 neu; im Importdialog von Excel stellst du Dateiursprung auf 65001: Unicode (UTF-8). Führe iconv nur aus, wenn die Datei wirklich Windows-1252 ist.
Warum bricht eine CSV mittendrin ab oder wird falsch gelesen?
Fast immer wegen eines einzigen nicht maskierten Anführungszeichens. Ein Wert wie 6" pipe muss mit verdoppeltem inneren Anführungszeichen geschrieben werden; sonst liest der Parser alles danach als einen riesigen String, und die Spaltenanzahl fängt sich nie wieder. `csvclean -n` meldet die erste Zeile, in der die Feldanzahl nicht stimmt.
Darf eine CSV-Datei Zeilenumbrüche innerhalb eines Felds enthalten?
Ja. RFC 4180 erlaubt das, sofern das Feld in Anführungszeichen steht, und jeder ordentliche Parser kommt damit klar. Zeilen scheinen mittendrin zu brechen, wenn ein Werkzeug an Zeilenumbrüchen trennt, bevor es Anführungszeichen berücksichtigt. Das gilt für die meisten Shell-Einzeiler und einige Tabellen-Importer. Nimm einen echten CSV-Parser, statt die Datei zu reparieren.
Wie entferne ich die BOM aus einer CSV-Datei?
Unter Linux mit `sed -i '1s/^\xEF\xBB\xBF//' file.csv`; unter macOS dasselbe mit `sed -i ''`. Tu das nur, wenn ein nachgelagertes Programm daran scheitert. Excel erkennt an der BOM, dass eine Datei UTF-8 ist, wenn du sie doppelklickst. Wer sie entfernt, sorgt dafür, dass bei der nächsten Person, die die Datei bekommt, Umlaute kaputtgehen.
Kann ich eine kaputte CSV auf dem Smartphone reparieren?
Bei Trennzeichen- und Kodierungsproblemen ja: Mit einer App, die eine Datei mit festen Einstellungen neu öffnet, löst du diese, ohne ein Byte zu ändern. Strukturelle Schäden wie ein nicht maskiertes Anführungszeichen erfordern, die betroffene Zeile zu finden und diese eine Zelle zu bearbeiten. Das geht, ist aber fummelig; sind mehr als ein paar Zeilen falsch, exportiere die Datei lieber neu.

uos — Entwickelt CSV Editor und Smart CSV Viewer und liest deshalb sehr viele CSV-Dateien, bei denen der Export eines anderen etwas falsch gemacht hat.