Der Fehlerbericht, der mich dazu brachte, dies zu erstellen, war drei Wörter lang: " die Synchronisierung lässt Zeilen fallen." Ein Client's-Produkt-Feed kam als nächtliches CSV, mein Laravel-Importeur schrieb es um, und irgendwo zwischen den beiden Dateien verschwanden eine Handvoll SKUs. Mein erster Instinkt war der offensichtliche: Werfen Sie beide Dateien in ein Linien-Diff. Das Diff kam einfarbig rot zurück Jede einzelne Zeile wurde geändert, " weil der Export in dieser Nacht von einer anderen Spalte neu sortiert worden war, also war Zeile 4 in der neuen Datei Zeile Zeile Zeile 900. Die Zeilen-Datei wurde tatsächlich von mir entfernt und war völlig nutzlos. CSV-Diff-Checker, und dieser Leitfaden ist der Grund dafür.
tl; dr: Ein CSV-Diff vergleicht zwei CSV-Dateien als strukturierte Daten statt als Textzeilen Übereinstimmen von Zeilen durch eine Schlüsselspalte wie
idoder
Ich baue SaaS-Produkte auf Laravel und React und ich versende WordPress-Plugins, was bedeutet, dass ich viel Zeit damit verbringe, Exporte in Einklang zu bringen: ein System' s Ansicht der Daten mit anderen's, letzte Nacht's Schnappschuss gegen heute Abend's, die Datei, die ein Kunde schwört, dass er sie gegen die Datei gesendet hat, die tatsächlich angekommen ist CSV ist die Verkehrssprache für alles, und der korrekte Vergleich zweier CSVs ist eine dieser Aufgaben, die trivial aussieht, bis Sie versuchen, es mit dem falschen Tool zu tun. Dies ist der Leitfaden, den ich gerne gelesen hätte.
Was ist ein CSV-Diff-Checker?
Ein CSV-Diff-Checker nimmt zwei CSV-Dateien, eine Original - und eine geänderte Version, und meldet, wie sich die zweite auf Ebene von Zeilen und Zellen von der ersten unterscheidet Statt der Added-and-Deleted-Lines-Ausgabe eines Textdiffs erhält man vier Buckets: Zeilen, die nur in der neuen Datei existieren (hinzugefügt), Zeilen, die nur in der alten Datei existieren (entfernt), Zeilen, die in beiden existieren, deren Werte sich aber unterscheiden (geändert), und Zeilen, die identisch (unverändert) sind Für jede geänderte Zeile geht ein gutes Tool eine Ebene tiefer und benennt die spezifischen Spalten, die sich verschoben haben, wobei neben der neue der alte Wert angezeigt wird.
Die Unterscheidung, die das Ganze funktioniert, ist, wie Zeilen über die beiden Dateien gepaart werden Ein CSV-Diff kann durch eine Schlüsselspalte übereinstimmen und einen Wert wie einen behandeln id oder ein email Als die Identität des Datensatzes, oder es kann nach Position übereinstimmen, Vergleich von Zeile eins zu Zeile eins Schlüsselübereinstimmung ist, was Sie fast jedes Mal wollen, wenn Sie Exporte vergleichen, weil derselbe Datensatz jedes Mal auf einer anderen Zeile landen kann, wenn die Daten gezogen werden Das Positionsabgleich ist für Dateien, bei denen die Zeilennummer selbst aussagekräftig und stabil ist, wie ein nummeriertes Hauptbuch, an das immer nur angehängt wird Die Wahl des richtigen Modus ist die wichtigste Einzelentscheidung, und deshalb stellt das Toolz-Tool sie in den Vordergrund und in die Mitte, anstatt zu raten.
Warum wird ein Leitungsdiff bei einem neu sortierten Export komplett rot?
Das ist der Ausfall, der Leute auf der Suche nach einem CSV-spezifischen Tool schickt, da lohnt es sich, genau zu verstehen Ein Textdiff, wie er in Git und jedem Code-Editor eingebaut ist, vergleicht Dateien Zeile für Zeile und in der Reihenfolge, er führt einen Algorithmus aus, der die längste gemeinsame Zeilenunterfolge findet und alles andere als eingefügt oder gelöscht markiert, das ist genau richtig für Quellcode, wo die Zeilenreihenfolge die Bedeutung der Datei ist Bewegen Sie eine Funktion und Sie haben die Datei wirklich verändert.
Ein CSV-Export ist das Gegenteil Die Reihenfolge der Reihen ist normalerweise ein Zufall von was auch immer ORDER BY Die Abfrage wurde zufällig verwendet, und sie kann zwischen zwei Durchläufen wechseln, die identische Daten enthalten In dem Moment, in dem sich die Sortierreihenfolge verschiebt, sieht ein Liniendiff fast jede Zeile an einer neuen Position, schafft es nicht, sie aufzureihen, und meldet die ganze Datei als geändert Die gewünschten Informationen, die drei Datensätze tatsächlich geändert haben, sind unter Tausenden von falsch positiven Ergebnissen begraben Das Diff hat seine Arbeit treu gemacht; es hat nur eine Frage zu Zeilen beantwortet, als Sie eine Frage zu Datensätzen hatten.
Ein CSV-Diff behebt dies, indem er die Datei zuerst in Zeilen und Spalten analysiert und dann Datensätze nach ihrem Schlüssel und nicht nach ihrer Zeilennummer vergleicht. Eine erneute Sortierung der Datei hat keine Wirkung, da die SKU A-1007 Reihe mit SKU verglichen wird A-1007 In der anderen Datei egal wo einer sitzt Das ist der ganze Grund warum die Kategorie existiert, und deshalb greife ich nach der CSV-Diff-Werkzeug anstelle git diff Immer wenn es sich bei der Datei um Daten und nicht um Code handelt.
Was hat RFC 4180 mit dem Vergleich von Dateien zu tun?
Alles, denn man kann zwei CSVs nicht richtig vergleichen, wenn man sie nicht vorher richtig analysieren kann CSV wurde jahrzehntelang verwendet, bevor es jemand standardisierte 2005 veröffentlichte die IETF RFC 4180, die das gemeinsame Format beschreibt und die text/csv MIME-Typ. Es ist kein Gesetz, dem jedes Werkzeug gehorcht, aber es kommt einem gemeinsamen Vertrag am nächsten und definiert die Regeln, nach denen ein naiver Vergleich falsch läuft.
Die Regel, auf die es am meisten ankommt, ist das Zitieren Ein Feld darf in doppelte Anführungszeichen gewickelt sein, und es muss sein, wenn es ein Komma, ein doppeltes Anführungszeichen oder einen Zeilenumbruch enthält Ein doppeltes Anführungszeichen innerhalb eines zitierten Feldes wird durch Verdoppeln entgangen Also der Wert "Doe, John" Ein einzelnes Feld ist, und "She said ""hi""" Wert ist She said "hi". Ein Vergleich, der jede Zeile auf Kommas aufteilt, wird geschnitten "Doe, John" In zwei Felder verschieben Sie jede Spalte danach und melden Sie dann selbstbewusst, dass sich die Zeile geändert hat, als dies nicht der Fall war. Das Toolz-Diff führt dieselbe RFC 4180-Zustandsmaschine aus, die die Stromversorgung durchführt CSV-Betrachter: es geht den Text zeichenweise, verfolgt, ob er sich innerhalb eines zitierten Feldes befindet, und behandelt ein Komma oder eine Zeilenumbruch nur dann als Trennzeichen, wenn er sich außerhalb der Anführungszeichen befindet Das Richtige zu erreichen ist eine Voraussetzung, um das Diff richtig zu machen, und es ist der Teil, den handgerollte Skripte fast immer überspringen.
Wie vergleiche ich zwei CSV-Dateien mit dem Tool?
Der Ablauf ist absichtlich kurz Fügen Sie die Originaldatei in das erste Feld und die geänderte Datei in das zweite ein, oder klicken Sie auf Beispiel laden, um ein funktioniertes Beispiel zu sehen, in dem eine Zeile bearbeitet, eine hinzugefügt und eine entfernt wird.
Bestätigen Sie den Trennzeichen Punktzahlen Komma, Semikolon, Tabulator und Pipe automatisch erkennen, indem Sie, wie konsistent jede einzelne die ersten mehreren Zeilen in die gleiche Anzahl von Spalten aufteilt, was europäische Semikolondateien und Tabulator-getrennte Exporte korrekt verarbeitet Wenn die Erkennung für Ihre Daten falsch ist, stellen Sie sie von Hand ein Lassen Sie den Header-Schalter eingeschaltet, wenn die erste Zeile jeder Datei Spaltennamen enthält, die den Schlüsselspalten-Selektor speist.
Wählen Sie nun aus, wie Zeilen übereinstimmen Wählen Sie eine Schlüsselspalte aus dem Dropdown, normalerweise eine id, email, oder SKU, und das Tool vergleicht Datensätze mit diesem Wert Wählen Sie stattdessen Position, um Zeile für Zeile zu vergleichen Zwei Kippschalter verfeinern den Vergleich: Schalten Sie die fallunempfindliche Übereinstimmung ein, wenn Active und active Soll als gleicher Wert zählen, und trimm-weißraum auf lassen, damit sich ein streunendes Führungsfeld nicht als Änderung registriert Klicken Sie auf Vergleichen, und die Zusammenfassung zeigt vier Zählungen auf einen Blick Öffnen Sie die Registerkarte Geändert, um jede bearbeitete Zeile zu erweitern und sehen Sie genau, welche Zellen sich bewegt haben, oder die Registerkarten Hinzufügen und Entfernen, um die vollständigen Zeilen als Tabelle zu sehen Wenn Sie fertig sind, kopieren Bericht oder herunterladen exportiert eine Klartext-Zusammenfassung jedes Unterschieds, einschließlich des Vorher-Nachher-Werts jeder geänderten Zelle, bereit, in eine Pull-Anfrage, ein Ticket oder eine E-Mail an den Client einzufügen.
Wann sollte ich nach Schlüssel versus Position übereinstimmen?
Dies ist die Wahl, die bestimmt, ob das Diff nützlich ist oder Rauschen, also hier ist die Regel, die ich verwende, als Tabelle aufgeführt.
| Situation | Übereinstimmung mit | wieso |
|---|---|---|
| Datenbank - oder API-Export, der neu sortiert werden kann | Schlüsselspalte | Die gleiche Platte landet bei jedem Zug auf unterschiedlichen Linien; Der Schlüssel ist seine stabile Identität |
| Abgleichen zweier Systeme' Ansicht derselben Datensätze | Schlüsselspalte | Es ist Ihnen wichtig, ob eine Platte existiert und auf beiden Seiten übereinstimmt, nicht dort, wo sie steht |
| Vergleichen Sie den Schnappschuss von gestern Abend's mit heute Abend's | Schlüsselspalte | Zeilen werden im Laufe der Zeit hinzugefügt und entfernt, sodass die Liniennummern abweichen |
| Nur-Protokoll oder Hauptbuch mit fester Bestellung anhängen | Position | Die Zeilennummer ist stabil und aussagekräftig; Zeile N ist wirklich & quot; das N-te Ereignis" |
| Zwei Dateien, die Sie kennen, teilen genau die gleiche Zeilenreihenfolge | Position | Kein Schlüssel existiert, aber die Bestellung ist garantiert identisch |
| Eine Datei ohne eindeutige Spalte | Position | Es gibt nichts, worauf man Wert legen könnte, also vergleichen Sie in der Reihenfolge und akzeptieren Sie die Einschränkung |
Die Kurzversion: Griff zum Tastenabgleich standardmäßig, denn die meisten CSVs sind Exporte von Datensätzen, die eine Kennung tragen Fallen Sie nur dann auf Positionsabgleich zurück, wenn kein verwendbarer Schlüssel vorhanden ist oder wenn die Zeilenreihenfolge wirklich Teil der Daten ist Wenn Sie einen Schlüssel auswählen und das Tool warnt, dass die Spalte doppelte Werte enthält, ist das ein Signal, dass die Spalte nicht wirklich eindeutig ist, und Sie sollten entweder einen besseren Schlüssel auswählen oder die Quelle bereinigen Ich habe mehr als einen fehlerhaften Export erfasst, genau weil die Spalte & quot;unique" ID nicht sein sollte.
Wie zeigt es, was sich tatsächlich hintereinander verändert hat?
Eine Zählung von & quot;5 Zeilen geändert" ist ein Anfang, aber die Frage, die Sie wirklich haben, ist " geändert wie?" Das Toolz diff beantwortet das pro Zeile Wenn ein übereinstimmender Datensatz abweicht, vergleicht es die beiden Versionen Spalte für Spalte und listet nur die Zellen auf, die sich bewegt haben, wobei jeder als vorheriger Wert neben dem neuen Wert durchgestrichen wird Eine Kundenzeile, in der nur der plan Spalte ging von free auf pro Berichtet, dass einzelne Zelle, nicht die ganze Aufzeichnung, so dass Sie nicht stehen bleiben zwei lange Reihen zu beobachten versuchen, das eine Feld zu erkennen, das geändert hat.
In dieser Ansicht auf Zellenebene verdient ein CSV-Diff seinen Keep über eine Tabellenkalkulation' eigene Vergleichsfunktionen, die dazu neigen, Zellen mit Farbe hervorzuheben, Ihnen aber nichts zum Kopieren oder Einfügen in eine Bewertung geben Der exportierte Bericht buchstabiert jede Änderung im Text: den Schlüssel der Zeile, den Spaltennamen und den alten und neuen Wert. In der Praxis füge ich das direkt in die Beschreibung einer Pull-Anfrage ein, damit ein Rezensent die Datenauswirkungen einer Migration sehen kann, ohne die Dateien selbst zu öffnen. Es ist derselbe Instinkt hinter dem Strukturellen JSON-DiffDas meldet geänderte Schlüssel mit ihren Pfaden und nicht verrauschte Zeilenänderungen; Beide Tools existieren, weil & quot; was geändert wurde" ist eine bessere Frage als " welche Zeilen sich unterscheiden."
Ist es sicher, sensible CSV-Dateien online zu vergleichen?
Für dieses Tool ja, und der Grund ist eher architektonisch als ein kleines Versprechen Jeder Schritt, das Parsen beider Dateien, das Anpassen von Zeilen, das Berechnen der Unterschiede pro Zelle und das Erstellen des Berichts, läuft als JavaScript in Ihrem eigenen Browser-Tab. Es gibt keinen Upload, keine Server-Round-Trip, und nichts wird protokolliert oder gespeichert. Sie können es beweisen, indem Sie Ihren Browser öffnen. & #39;s Netzwerk-Tab und auf Vergleichen klicken: Keine Anfrage verlässt die Seite. Sobald die Seite geladen wurde, können Sie die Verbindung zum Internet vollständig trennen und es funktioniert weiter.
Das ist wichtig, weil die CSVs, die die Leute verbreiten, zu den sensibelsten Dateien gehören, die ein Unternehmen besitzt Kundenlisten, Transaktionsexporte, Lohn- und Gehaltsabrechnungszeilen, Inventartabellen und Zugriffsprotokolle werden alle als CSV übertragen. Ein Vergleichstool, das Ihre Dateien auf einen Server hochlädt, wie gut gemeint sie auch sein mögen, verwandelt zwei private Tabellenkalkulationen in jemand anderen. & #39;s-Protokolleinträge. Die clientseitige Verarbeitung beseitigt die Frage: Die Daten verlassen nie die Maschine, auf der sie gestartet wurden. Diese Standardeinstellung ist in jedem Tool auf Toolz.dev bewusst, und ich habe das längere Argument in der geschrieben Datenschutzleitfaden für Online-Tools Für jeden, der die volle Begründung haben will.
Wie passt ein CSV-Diff in einen echten Workflow?
Das Diff ist selten der ganze Job; es ist eine Station in einer Pipeline Das Muster, das ich am häufigsten traf, ist die Verifizierung: Ich führe einen Import oder eine Migration aus, diff die Vorher-Nachher-Exporte dann, um zu bestätigen, dass das Skript genau das getan hat, was ich erwartet hatte, und nichts weiter Ein sauberes Diff von & quot; drei geändert, null entfernt" ist ein weitaus besseres Zeichen dafür, dass eine Migration funktioniert hat als ein grünes Häkchen aus dem Skript, das es ausgeführt hat Wenn das Diff eine Entfernung zeigt, die ich nicht beabsichtigt hatte, habe ich den Fehler erkannt, bevor es die Produktion erreicht hat, statt danach.
Die Werkzeuge drumherum hängen davon ab, wofür die Datei ist Wenn ich vor dem Vergleich eine Datei als sortierbares Raster betrachten muss, wird die CSV-Betrachter Rendert die gleiche RFC 4180-Analyse als Tabelle Wenn es bei dem von mir gewünschten Vergleich wirklich um die Mitgliedschaft geht, welche Werte in einer Datei erscheinen, aber nicht in der anderen und nicht welche Zeilen sich geändert haben, wird die Vergleichen Sie das Tool mit zwei Listen Stellt Arithmetik auf einzelne Spalten und passt besser Und wenn die Daten zu etwas werden müssen, das eine API verbrauchen kann, ist die CSV-zu-JSON-Konverter Ist der nächste Hop Keiner von diesen lädt deine Daten hoch, also kannst du sie ohne einen zweiten Gedanken an dieselbe private Datei ketten Wenn du ein Kit für diese Art von Datenarbeit zusammenbaust, meine Leitfaden für Webentwickler-Toolkit Durchläuft, wie sich die Teile verbinden.
Häufig gestellte Fragen
Wie vergleiche ich zwei CSV-Dateien? Öffne das CSV-Diff-Checker‘das ursprüngliche CSV in das erste Feld und das geänderte CSV in das zweite einfügen, die Einstellungen für Trennzeichen und Kopfzeile bestätigen, eine Schlüsselspalte oder Positionsanpassung wählen und auf Vergleichen klicken Das Ergebnis wird in hinzugefügte, entfernte und geänderte Zeilen aufgeteilt, und jede geänderte Zeile zeigt die genauen Zellen an, die sich unterscheiden Alles läuft in Ihrem Browser, sodass die Dateien nie hochgeladen werden.
Was ist der Unterschied zwischen Key Matching und Positionsmatching?
Schlüsselübereinstimmung paart Zeilen, die in einer ausgewählten Spalte denselben Wert haben, wie z idten, so wird ein Datensatz mit seinem Gegenstück verglichen, wo immer er in einer der beiden Dateien erscheint Position Matching vergleicht Zeile eins mit Zeile eins in Dateireihenfolge Verwenden Sie Schlüsselabgleich für Exporte, die neu sortiert werden können, und Positionsabgleich für Dateien fester Ordnung wie ein Nur-Anhang-Protokoll.
Warum zeigt ein Textdiff jede Zeile als geändert an, wenn sich die Daten kaum bewegt haben? Denn ein Textdiff vergleicht Dateien Zeile für Zeile und in der Reihenfolge, wird der Export neu sortiert, landet fast jede Zeile an einer neuen Position und das Diff markiert die ganze Datei als geändert, obwohl die zugrunde liegenden Datensätze gleich sind Ein CSV-Diff analysiert die Datei in Zeilen und Spalten und vergleicht Datensätze nach Schlüssel, sodass eine erneute Sortierung keine Wirkung hat und nur echte Änderungen gemeldet werden.
Zeigt es an, welche bestimmte Zelle sich hintereinander verändert hat? Ja. Wenn eine übereinstimmende Zeile abweicht, listet das Tool jede geänderte Spalte namentlich auf und zeigt den vorherigen Wert neben dem neuen Wert an Eine Zeile, in der nur die Statusspalte von aktiv nach geschlossen verschoben wurde, meldet diese einzelne Zelle, anstatt die gesamte Zeile zu markieren.
Welche Trennzeichen unterstützt es? Komma, Semikolon, Tabulator und Pipe. Das Trennzeichen wird automatisch aus der ersten Datei erkannt, indem das Trennzeichen ausgewählt wird, das eine konsistente Spaltenanzahl über die ersten Zeilen erzeugt, und Sie können es manuell überschreiben, wenn die Erkennung für Ihre Daten falsch ist.
Was passiert, wenn meine Schlüsselspalte doppelte Werte hat? Das Tool warnt Sie, dass die Schlüsselspalte Duplikate enthält und vergleicht nur die erste Zeile für jeden Schlüssel Doppelte Schlüssel bedeuten normalerweise, dass die Spalte keine echte eindeutige Kennung ist, so dass die Warnung eine Aufforderung ist, einen anderen Schlüssel auszuwählen oder die Daten zu bereinigen, bevor Sie dem Diff vertrauen.
Werden meine CSV-Dateien irgendwo hochgeladen? Nr. Alle Parsing und Vergleich laufen lokal in Ihrem Browser mit einfachem JavaScript, es wird nichts übertragen, protokolliert oder gespeichert, und Sie können es im Netzwerk-Tab bestätigen, wo keine Anfrage erscheint Das Tool funktioniert auch offline weiter, sobald die Seite geladen wurde.
Wie groß kann eine Datei verarbeiten? Beim Key Matching werden Hash-Maps anstelle von verschachtelten Schleifen verwendet, sodass es ungefähr linear skaliert und Zehntausende Zeilen bequem verarbeitet. Die praktische Grenze besteht darin, dass Ihr Browser einen sehr großen Ergebnissatz wiedergibt, nicht den Vergleich selbst.



