Zwei CSV-Dateien vergleichen und Änderungen finden
Der schnellste Weg, zwei CSV-Dateien zu vergleichen, besteht darin, beide in ein nebeneinander angeordnetes Diff-Tool einzufügen, die Spalten auszurichten und die hervorgehobenen Zeilen zu lesen. Der Vergleich ist der einfache Teil. Das Rauschen ist es, was den Leuten zu schaffen macht: ein umgeordneter Export, ein Semikolon statt eines Kommas oder ein Wert, den jemand in Anführungszeichen gesetzt hat, können dazu führen, dass zwei Dateien mit denselben Daten aussehen, als hätten sie nichts gemeinsam.
Dieser Leitfaden erklärt, wie man einen sauberen, zuverlässigen CSV-Diff erhält. Wir schauen uns an, warum zwei gleichwertige Exporte auf dem Papier auseinanderdriften, welche Methoden es wert sind zu kennen, und ein ausgearbeitetes Beispiel, dem man folgen kann. Wer einfach nur das Tool möchte, kann auf unserer CSV-Vergleichsseite all das im Browser erledigen.
Warum CSV-Dateien trügerisch schwer zu vergleichen sind
CSV sieht einfach aus, hat aber keinen einzigen strengen Standard. Das Nächste ist RFC 4180, und viele reale Dateien halten sich nicht daran. Zwei Exporte derselben Tabelle können sich in Trennzeichen, Anführungszeichen, Zeilenenden und Zeilenreihenfolge unterscheiden und dabei genau dieselben Daten beschreiben. Ein einfacher Textvergleich weiß nichts davon und markiert daher alles.
Hier ist das Wichtigste, das man vor dem Start entscheiden sollte: Ist die Zeilenreihenfolge für einen wichtig? Ein nach Name sortierter Datenbankexport und derselbe nach ID sortierte Export enthalten die identische Menge an Datensätzen, aber ein Zeilendiff färbt fast jede Zeile rot und grün. Wenn die Zeilen einen stabilen Schlüssel haben (eine ID-Spalte), macht das vorherige Sortieren beider Dateien nach diesem Schlüssel den Diff wieder lesbar.
| Was man im Diff sieht | Ist es eine echte Änderung? | Was zu tun ist |
|---|---|---|
| Zeilen in anderer Reihenfolge | Nein, wenn die Daten dieselbe Menge sind | Beide Dateien nach einer Schlüsselspalte sortieren |
| Komma- vs. Semikolon-Trennzeichen | Nein, gleiche Felder | Auf ein Trennzeichen normalisieren |
Ada vs. "Ada" | Nein, Anführungszeichen sind hier optional | Anführungszeichen normalisieren |
| CRLF- vs. LF-Zeilenenden | Nein | Zeilenenden normalisieren |
| Eine abschließende Leerzeile | Nein | Entfernen |
| Ein Zellenwert hat sich geändert | Ja | Untersuchen, das ist real |
Die Trennzeichen-Zeile erwischt viele Leute, besonders über Regionen hinweg: viele europäische Locales verwenden ein Semikolon, weil das Komma das Dezimaltrennzeichen ist. Gleiche Daten, anderes Trennzeichen. Wer das Detail dazu möchte, wie Browser und Tools tabellarischen Text lesen, findet bei MDN unter Dateien im Browser lesen einen nützlichen Ausgangspunkt.
Vier Methoden zum Vergleichen von CSV und wann man zu welcher greift
Es gibt keine einzige beste Methode. Es hängt von der Größe der Dateien ab und davon, ob die Zeilenreihenfolge wichtig ist. So schneiden die gängigen Optionen ab.
| Methode | Am besten für | Aufwand | Versteht CSV? |
|---|---|---|---|
| Manuell durchsehen | Winzige Dateien, eine Handvoll Zeilen | Gering | Nein, man ist der Parser |
| Online-Diff-Tool | Schnelle Prüfungen, Einfügen von überall | Gering | Zeile für Zeile, ja |
| Tabellenkalkulation | Visuelle Prüfung, Formeln, Filtern | Mittel | Ja, aber manuell |
Befehlszeile (sort, csvkit) | Große Dateien, Scripting, schlüsselbasierte Vergleiche | Mittel | Ja, wenn man zuerst sortiert |
Für die meisten Menschen gewinnt ein Browser-Tool an Geschwindigkeit: nichts zu installieren, und man kann einen Export direkt aus einem Download oder einem Datenbank-Client einfügen. Der Haken ist das Rauschen durch Zeilenreihenfolge und Trennzeichen, das wir als Nächstes behandeln. Für sehr große Dateien lohnt es sich, csvkit auf der Befehlszeile zu lernen.
Der schnellste saubere Vergleich, Schritt für Schritt
Das ist die Routine, die ich verwende, wenn mir jemand zwei Exporte gibt und fragt: "Was ist anders?" Es dauert unter einer Minute.
- Sicherstellen, dass beide Dateien dasselbe Trennzeichen und dieselbe Kopfzeile haben.
- Wenn die Zeilenreihenfolge keine Rolle spielt, beide Dateien zuerst nach einer Schlüsselspalte sortieren.
- Das CSV-Vergleichstool öffnen.
- Das Original links einfügen, die neue Version rechts.
- Das Ergebnis lesen. Grün ist eine hinzugefügte Zeile, rot eine entfernte Zeile, und eine geänderte Zelle erscheint als je eine von beiden.
Schritt zwei ist der ganze Trick, wenn die Zeilen ungeordnet sind. Sobald beide Dateien gleich sortiert sind, bleibt nur noch hervorzuheben, welche Zeilen sich tatsächlich geändert haben. Unser Diff-Engine basiert auf Googles diff-match-patch, das zuerst zeilenweise vergleicht und so auch bei langen Dateien schnell bleibt.
Ein ausgearbeitetes Beispiel
Angenommen, man prüft eine Änderung an einer Benutzertabelle. Hier ist der Vorher-Stand:
id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1
Und hier ist der Nachher-Stand, in einer anderen Zeilenreihenfolge exportiert:
id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5
Wirft man diese in einen einfachen Zeilendiff, sehen beide Datenzeilen
geändert aus, weil sie die Position getauscht haben. Sortiert man beide nach
der Spalte id, ist die eigentliche Geschichte kurz:
| Zeile (nach id) | Spalte | Vorher | Nachher | Änderung |
|---|---|---|---|---|
| 7 | role | editor | admin | Geändert |
| 7 | seats | 3 | 5 | Geändert |
| 8 | — | — | — | Keine Änderung (nur verschoben) |
Eine echte Bearbeitung: Adas Rolle und Sitzanzahl haben sich geändert. Alans
Zeile wurde nur verschoben. Diese Beförderung von editor zu
admin ist genau die Art von Sache, die man im Review erkennen
möchte, und sie ist leicht zu übersehen, wenn sie unter Zeilen vergraben ist,
die der Diff fälschlich als geändert markiert hat.
Das Rauschen der Zeilenreihenfolge in der Befehlszeile beseitigen
Wenn die Dateien bereits auf der Festplatte liegen und die Zeilen keine inhärente Reihenfolge haben, funktioniert dieselbe "zuerst sortieren"-Idee mit zwei kurzen Befehlen. Die Kopfzeile an Ort und Stelle lassen und den Rest sortieren:
(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv
Jetzt meldet diff nur noch Zeilen, die sich wirklich geändert
haben, weil beide Dateien in derselben Reihenfolge sind. Für schlüsselbasierte
Vergleiche, die auch die Spaltenreihenfolge ignorieren, geben einem
csvsort und csvjoin von csvkit mehr Kontrolle. Das
ist das Terminal-Äquivalent dazu, beide Seiten vor dem Vergleich im Browser
zu sortieren.
Trennzeichen, Anführungszeichen und die unordentliche Realität
Echte CSV-Dateien brechen die Regeln ständig. Ein Feld, das ein Komma
enthält, muss in Anführungszeichen stehen, also ist "Lovelace, Ada"
ein Feld, nicht zwei. Anführungszeichen innerhalb eines zitierten Feldes
werden verdoppelt: "Sie sagte ""hallo""". Und das Trennzeichen
selbst variiert: Tabellenkalkulationen in Locales mit Dezimalkomma
exportieren mit Semikolons, und tabulatorgetrennte Dateien (TSV) sind in
Daten-Pipelines üblich. Stellen Sie vor dem Vergleichen sicher, dass beide
Dateien dasselbe Trennzeichen und dieselbe Anführungszeichen-Konvention
verwenden, oder normalisieren Sie sie mit einem Parser, der RFC 4180 folgt.
Andernfalls vergleicht der Diff zwei verschiedene Dialekte, nicht zwei
Versionen derselben Daten.
Häufige Fallstricke, auf die man achten sollte
| Fallstrick | Warum er zuschlägt | Lösung |
|---|---|---|
| Nicht übereinstimmende Trennzeichen | Komma vs. Semikolon lässt jedes Feld unterschiedlich aussehen | Zuerst auf ein Trennzeichen normalisieren |
| BOM am Anfang | Eine versteckte Byte-Order-Markierung ändert die erste Kopfzellen | Das BOM vor dem Vergleich entfernen |
| IDs mit führenden Nullen | Eine Tabellenkalkulation hat 007 möglicherweise in 7 umgewandelt | ID-Spalten als Text behalten; als Strings vergleichen |
| Eingebettete Zeilenumbrüche | Ein zitiertes Feld kann einen Zeilenumbruch enthalten und jede spätere Zeile verschieben | Einen echten CSV-Parser verwenden, keine Zeilenaufteilung |
| Abschließende Leerzeichen in Zellen | Unsichtbare Leerzeichen erscheinen als Änderung | Zellenwerte vor dem Vergleich trimmen |
Wann eine Tabellenkalkulation das bessere Werkzeug ist
Ein Textdiff ist perfekt, um zu erkennen, welche Zeilen sich geändert haben, und um die Änderung als Daten zu überprüfen. Aber wenn man über Tausende von Zeilen filtern, pivotieren oder per Formel vergleichen muss, passt eine Tabellenkalkulation besser: beide Dateien importieren, nach Schlüssel ausrichten und mit einem Lookup Abweichungen markieren. Die beiden Ansätze ergänzen sich. Den Diff für eine schnelle visuelle Lesung verwenden und die Tabellenkalkulation, wenn man die Daten zerlegen muss. Für die Regeln des zugrunde liegenden Formats in beiden Fällen ist die CSV-Übersicht von Wikipedia eine solide Referenz.
Verwandte Tools
CSV ist selten das einzige Format, mit dem man zu tun hat. Wenn dieselben Daten auch als JSON vorliegen, wendet JSON-Vergleich dieselbe Idee an. Das Entfernen von Duplikaten in einer Wertespalte geht schnell mit doppelte Zeilen entfernen, und Zeilen vor einem Diff in eine vorhersehbare Reihenfolge zu bringen, ist genau das, wofür Zeilen sortieren da ist.
Häufig gestellte Fragen
- Werden CSV-Dateien beim Online-Vergleich irgendwo hochgeladen?
- Auf comparetext.org läuft der Diff im Browser. Die beiden CSV-Dateien werden von JavaScript auf dem eigenen Computer verglichen, sodass nichts an einen Server gesendet wird, es sei denn, man klickt ausdrücklich auf Speichern oder Teilen. Das macht es sicher für Kundenexporte, Finanzdaten und andere Tabellen, die man nicht auf einer Website einfügen möchte, die bei jedem Tastendruck hochlädt.
- Warum zeigen meine zwei CSV-Dateien jede Zeile als unterschiedlich an?
- Fast immer ist es die Zeilenreihenfolge oder das Trennzeichen, keine echten Änderungen. Ein Export ist anders sortiert als der andere, oder einer verwendet Kommas und der andere Semikolons, oder die Zeilenenden unterscheiden sich. Stellen Sie sicher, dass beide Dateien dasselbe Trennzeichen verwenden, sortieren Sie dann beide nach einer Schlüsselspalte, damit die Reihenfolge keine Rolle mehr spielt. Danach schrumpft der Diff meist auf die wenigen Zeilen und Zellen, die sich wirklich geändert haben.
- Wie vergleiche ich zwei CSV-Dateien und ignoriere dabei die Zeilenreihenfolge?
- Sortieren Sie beide Dateien vor dem Vergleich nach einer stabilen Schlüsselspalte. Wenn die Zeilen eine ID haben, sortieren Sie danach; andernfalls sortieren Sie die ganze Zeile. Lassen Sie die Kopfzeile an Ort und Stelle und sortieren Sie nur die Datenzeilen. Im Browser können Sie die sortierten Versionen einfügen; in der Befehlszeile sortieren Sie die Datei nach der Kopfzeile. Sobald beide Dateien in derselben Reihenfolge sind, erscheinen nur die Zeilen, die sich tatsächlich geändert haben, im Diff statt jeder Zeile, die sich bloß verschoben hat.
- Warum verwendet mein CSV Semikolons statt Kommas?
- Viele europäische Locales verwenden das Komma als Dezimaltrennzeichen, sodass Tabellenkalkulationen CSV stattdessen mit einem Semikolon-Trennzeichen exportieren, um Mehrdeutigkeit zu vermeiden. Die Daten sind dieselben; nur das Trennzeichen unterscheidet sich. Stellen Sie vor dem Vergleich zweier Dateien sicher, dass sie dasselbe Trennzeichen verwenden, sonst sehen Sie jedes Feld als geändert markiert. Beide auf Kommas (oder beide auf Semikolons) mit einem CSV-fähigen Tool zu normalisieren, behebt das. Tabulatorgetrennte Dateien haben dasselbe Problem mit einem anderen Trennzeichen.
- Wie vergleiche ich CSV-Dateien mit unterschiedlicher Spaltenreihenfolge?
- Ein einfacher Textdiff vergleicht Zeilen von links nach rechts, sodass umgeordnete Spalten wie eine völlige Änderung aussehen, selbst wenn die Daten übereinstimmen. Um das zu handhaben, ordnen Sie die Spalten in beiden Dateien zuerst so um, dass sie übereinstimmen, oder verwenden Sie ein CSV-fähiges Tool, das nach Kopfzeilennamen statt nach Position vergleicht. Befehlszeilentools wie csvkit können Spalten nach Namen auswählen und umordnen. Sobald die Spalten in derselben Reihenfolge ausgerichtet sind, funktioniert ein normaler zeilenweiser Diff wieder.
- Kann ich große CSV-Dateien vergleichen, ohne dass die Seite einfriert?
- Ja, bis zu einem gewissen Punkt. Ein zeilenbasierter Diff bleibt bei Dateien mit Tausenden von Zeilen schnell, weil er zunächst ganze Zeilen vergleicht statt jedes einzelne Zeichen. Sehr große Dateien (Dutzende von Megabyte oder Millionen von Zeilen) lassen sich besser mit einem Befehlszeilentool wie csvkit oder einem Datenbankimport bearbeiten, die die Daten streamen. Für einen Export, durch den man bequem in einem Browser scrollen kann, ist ein Online-Diff die schnellere Option.
Bereit, es auszuprobieren? Dateien in das CSV-Vergleichstool einfügen und sehen, was sich geändert hat.