Ein Support-Ingenieur fragte mich einmal, warum vierzig Kunden zweimal eine Verlängerungs-E-Mail erhalten hättenDie Antwort brauchte eine Stunde, um sie zu finden, und war völlig banal: Die Kampagnenliste war zusammengestellt worden, indem man einen Export unter einen anderen eingefügt hatte, und in beiden existierten vierzig Adressen. Niemand hatte nachgesehen, denn das Nachprüfen bedeutete entweder, zweitausend Reihen zu betrachten oder eine zu schreiben VLOOKUP Die Hälfte des Teams hat & #39; t vertrauen Also hat niemand nachgesehen, und denselben vierzig Leuten wurde zweimal gesagt, dass ihre Karte gleich aufgeladen werden würde.
Das ist die Form dieses Problems Das Abgleichen zweier Listen ist eines der häufigsten Dinge, die jemand mit Daten macht, und it's ist langweilig genug, dass die Leute es entweder überspringen oder schlecht machen. Der Instinkt besteht normalerweise darin, nach einem Diff-Tool zu greifen, beide Listen einzufügen und auf die farbige Ausgabe zu schielen - was sofort fehlschlägt, weil ein Diff eine Frage beantwortet, die Sie gestellt haben & #39;t. Oder Sie gehen zu einer Tabelle und beginnen mit dem Zusammenstellen MATCH/COUNTIF Formeln, was funktioniert, aber zehn Minuten dauert und ein Artefakt erzeugt, das Sie' wird niemals wiederverwendet.
Die Operation, die Sie eigentlich wollen, hat einen Namen und it' s älter als alle Tools: arithmetik einstellen Schnittmenge, Differenz, Vereinigung Ich baue [Toolz.dev] (/ und setze ein browserbasiertes Listenvergleichswerkzeug Dort geht es in diesem Leitfaden jedoch um die Konzepte darunter - warum Ordnung ignoriert werden sollte, welcher Fall leise zusammenklappt und wie man zwischen diesem und einem Diff hin- und herwählt.
tl; dr: Um zwei Listen zu vergleichen, behandeln Sie jede als ungeordnete Menge und berechnen Sie den Schnittpunkt (Elemente in beiden), die beiden Unterschiede (Elemente nur in A, Elemente nur in B) und die Duplikate innerhalb jeder Liste. Bestellen Sie die Reihenfolge vollständig - ein Liniendiff ist das falsche Werkzeug, da es 's positional ist, sodass das Neuordnen einer Liste fast jede Zeile verändert aussehen lässt. Falten Sie den Fall für Bezeichner wie E-Mails, bewahren Sie jedoch den Originaltext in der Ausgabe auf, trimmen Sie den Leerraum vor dem Vergleich und tun Sie dies im Browser, da es sich bei den Listen, die Personen abgleichen, normalerweise um Kundendaten handelt.
Welche Fragen beantwortet der Vergleich zweier Listen eigentlich?
Wenn man die Operationen benannt sieht, werden die Formen offensichtlich Gegebene Liste A und Liste B:
- Kreuzung- was's in beiden? welche Abonnenten sind auch zahlende Kunden Welches vom letzten Monat's SKUs sind noch in diesem Monat's Katalog.
- A minus B- what' s nur in A? welche User im CRM haben es nie in die Abrechnung geschafft Welche Dateien existieren lokal aber nicht auf dem Server.
- B minus A- was's nur in B? Die gleiche Frage in die andere Richtung, und es's a verschieden Frage. Fehlende Abrechnung und Fehlende Abrechnung sind zwei unterschiedliche Fehler mit zwei unterschiedlichen Ursachen.
- Symmetrischer Unterschied- what' s in genau einer Liste? die Vereinigung beider Unterschiede: alles, was nicht übereinstimmte, unabhängig von der Richtung Dies ist die " what' s out of sync?" Frage.
- Union- alles aus beiden Listen, de-dupliziert Die Zusammenführung, richtig gemacht.
- Dupliziert innerhalb einer Liste- was's werden allein in A wiederholt? Dies ist ' überhaupt kein Vergleich, aber es & #39;s ist immer die Frage, die Sie gebraucht haben, denn es & #39;s, was Doppelsendungen und Doppelabrechnungen verursacht.
Das letzte ist es wert, herausgetrennt zu werden. Cross-List-Matching und Duplizierung innerhalb der Liste sind unabhängig: Eine Adresse kann zweimal in A angezeigt werden und Erscheinen auch in B. Tools, die nur listenübergreifende Ergebnisse melden, verfehlen den Fehler, der Geld kostet.
Hier wird alles direkt auf Operationen abgebildet, die Sie bereits aus SQL kennen - INTERSECT, EXCEPT, UNION- und auf Tabellenkalkulationsformeln Der Wert eines dedizierten Tools ist & #39; t, dass es etwas tut, was Sie können & #39; t; it& #39; s, dass alle sechs Antworten aus einer Paste angezeigt werden, anstatt sechs verschiedene Formeln.
Warum ist ein Diff-Tool die falsche Wahl für den Listenvergleich?
Das ist der Fehler, den ich am meisten sehe, und es's lohnt es, genau zu sein, denn " vergleichen Sie zwei Listen" und " zwei Dateien unterscheiden" klingen wie Synonyme.
Ein Diff ist positionell. Diff-Algorithmen berechnen das minimale Bearbeitungsskript - die kürzeste Folge von Einfügungen und Löschungen, die eine Sequenz in die andere verwandelt. That's ist das richtige Modell für Quellcode und Prosa, wobei Zeile 40 nach Zeile 39 lautet Sinnvoll. Verschieben Sie eine Funktion und ein Diff meldet korrekt, dass Sie eine Funktion verschoben haben.
Eine Liste hat keine sinnvolle Reihenfolge. Zeile 300 in Ihrem CRM-Export hat keinerlei Beziehung zu Zeile 300 in Ihrem Abrechnungsexport. They' Es gibt zwei Beutel mit Artikeln, die zufällig in der Reihenfolge notiert werden, in der die Datenbank zurückgegeben wird.
Füttern Sie ungeordnete Daten an einen Positionsalgorithmus und Sie erhalten Rauschen Nehmen Sie zwei Listen mit identischem Inhalt, sortieren Sie eine davon und verbreiten Sie sie:
List A List B
alice bob
bob alice
carol carol
Ein Diff meldet, dass alice Entfernt und wieder hinzugefügt wurde, oder das bob Verschiebt - etwas Abwechslung proportional dazu, wie unterschiedlich die beiden sortiert sind Die richtige Antwort ist Es änderte sich nichts. Jedes Element ist in beiden Listen Die Mengen sind gleich Ein Diff kann' nicht das sagen, weil es ' t ist, die nach Mitgliedschaft fragen.
Die Vergleichstabelle, da sich die Tools in den Köpfen von Menschen, die beides suchen, tatsächlich überschneiden:
| Liste vergleichen | Textdiff | |
|---|---|---|
| Modell | Unbestellter Satz von Artikeln | Geordnete Zeilenfolge |
| Auftragsangelegenheiten? | Nein - frei nachbestellen, Ergebnisse identisch | Ja - Nachbestellen von Sendungen als Änderungen |
| Antworten | Mitgliedschaft: in beiden Fällen nur A, nur B, dupliziert | Bearbeitet: was einzufügen/löschen ist, um A in B zu verwandeln |
| Duplikate | Explizit als Gruppe gemeldet | Nur noch mehr Zeilen |
| gut für | Abstimmung von Exporten, E-Mail-Listen, IDs, Artikelnummern und Vorräten | Quellcode, Prosa, Konfigurationsdateien, alles, wo Position Bedeutung hat |
| Schlecht für | Vergleich zweier Versionen eines Dokuments | Jede Liste, in der die Sortierreihenfolge beliebig ist |
Die Regel: Wenn Sie' d mit der anders sortierten Liste gleichermaßen zufrieden sein sollten, möchten Sie einen Mengenvergleich. Wenn eine Neuordnung der Zeilen eine wirklich meldepflichtige Änderung wäre, möchten Sie die Text Diff Checker. Für strukturierte Daten mit verschachtelten statt flachen Linien gilt keines von beiden - das & #39; s was die json diff ist für, da es nach Schlüsselpfad und nicht nach Linie oder Mitgliedschaft vergleicht.
Wie soll die Case Sensitivity funktionieren?
Dies ist die Option, die Leute standardmäßig verlassen und dann stillschweigend falsch liegen, also it's, die es wert sind, einmal durchdacht zu werden.
Case-insensitive Matching ist die richtige Voreinstellung für die Daten, die die meisten Menschen vergleichen E-Mail-Adressen, Benutzernamen, Domainnamen, Produktcodes, Ländercodes - diese sind in der Praxis herkömmlicherweise fallunsensibel, und [email protected] und [email protected] In jedem System, das zählt, dieselbe Person sind.
There's ist hier ein pedantischer Vorbehalt, dass 's wissenswert sind, weil es & #39;s gelegentlich tragend: per RFC 5321, der Domain-Teil einer E-Mail-Adresse ist fallunempfindlich, aber die Lokal Teil - alles vor dem @- formal fallsensibel ist und dem empfangenden Mailserver zur Interpretation überlassen bleibt Also [email protected] und [email protected] Könnte im Prinzip verschiedene Postfächer sein In der Praxis behandelt sie im Wesentlichen jeder große Anbieter als identisch, und wenn Sie & #39; eine Mailingliste de-duplizieren, sollten Sie unbedingt Fall falten Aber wenn Sie' re debuggen, warum eine bestimmte Adresse springt, dass & #39; ist die Art von Details, die sich als wichtig herausstellen.
Fall-Empfindlich Das Matching ist für alles korrekt, wo case Informationen trägt: Linux-Dateipfade, base64-Strings, Hashes, JWT-Token, API-Schlüssel, Git-SHAs, die meisten Programmier-Identifikatoren Das Falten eines Falls auf einer Liste von Passwort-Hashes würde verschiedene Werte zusammenführen und Ihnen eine sicher falsche Antwort geben.
Das Implementierungsdetail, das wichtiger ist als die Option selbst: Faltschale zum Abgleichen, aber zeigen Sie den Originaltext an. Wenn Sie einfügen [email protected] Und das Tool sagt es Ihnen & #39;s in beiden Listen, es sollte zurückgeben [email protected]- nicht [email protected]. Die Absenkung der Ausgabe korrumpiert Ihre Daten auf dem Weg durch stillschweigend, und da der übliche nächste Schritt darin besteht, das Ergebnis woanders einzufügen, breitet sich diese Korruption aus. Das Tool behält die zuerst gesehene Form jedes Elements bei und stimmt hinter den Kulissen auf einem gefalteten Schlüssel überein. Was also herauskommt, ist das, was Sie hineingeben.
Whitespace verdient die gleiche Behandlung und wird weniger überdacht Kopieren Sie eine Spalte aus einer Tabellenkalkulation oder teilen Sie eine Zeile wie a, b, c Auf Kommas erhalten Sie Elemente mit führenden Leerzeichen. [email protected] und [email protected] Es handelt sich um unterschiedliche Zeichenfolgen und identische Adressen. Aus diesem Grund ist Trimming standardmäßig aktiviert, und it's die Option you'd innerhalb von etwa dreißig Sekunden nach der tatsächlichen Verwendung fehlt.
Welchen Trenner soll ich benutzen?
Standardmäßig ist ein Element pro Zeile, das erhalten Sie beim Einfügen einer Tabellenkalkulationsspalte - die Zwischenablage übergibt durch Zeilenumbrüche getrennte Werte, sodass eine E-Mail-Spalte aus Excel, Google Sheets oder einem CSV-Export ohne Neuformatierung einfällt.
Die anderen Trennzeichen decken Daten ab, die bereits inline ankommen Komma für eine einzelne CSV-Zeile oder ein kopiertes Array Semikolon für die Outlook - und ältere-Windows-Konvention für Adresslisten Leerzeichen für Shell-Ausgabe - ls, git diff --name-only Durchgeleitet trAlles, was durch den Raum begrenzt ist Tab für eine Reihe, die horizontal und nicht vertikal aus einer Tabellenkalkulation eingefügt wird.
Eines ist zu beachten: Die Aufteilung auf Kommas ist nicht CSV-Parsing. Ein echtes CSV-Feld kann ein Komma in Anführungszeichen enthalten, und eine naive Spaltung wird reißen "Smith, Jane" In zwei Elemente Wenn Sie' re ziehen eine Spalte aus einer echten CSV-Datei mit zitierten Feldern, führen Sie es durch die CSV-Betrachter Zuerst - es implementiert die eigentlichen RFC 4180 Zitatregeln - dann kopieren Sie die Spalte, die Sie wollen Für eine flache Liste von E-Mails oder IDs ohne eingebettete Kommas ist das Teilen in Ordnung und dies tut & #39; t kommen.
Leere Einträge werden standardmäßig weggelassen, da sie' fast immer Artefakte sind: eine nachgestellte Zeilenumbruchzeile am Ende einer Paste, eine leere Zeile in einer Tabellenkalkulation, ein Doppelkomma. Eine leere Zeichenfolge ist't ein Element in jeder Liste, die Ihnen tatsächlich am Herzen liegt Die Option besteht, wenn Sie ' gezielt nach leeren Zeilen in einem Export suchen, was eine echte, wenn auch ungewöhnliche Wunschvorstellung ist.
Wie skaliert der Vergleich?
Der naive Ansatz zum Vergleich zweier Listen ist eine verschachtelte Schleife: Scannen Sie für jedes Element in A alle B. That's O (nSTRm) und it's für hundert Artikel in Ordnung und für fünfzigtausend unbrauchbar, wobei Sie' führen 2,5 Milliarden Zeichenfolgenvergleiche durch.
Der richtige Ansatz indiziert jede Liste in eine Hash-Karte, die durch den Vergleichsschlüssel - die gefaltete, beschnittene Form des Elements - getastet wird, wobei der Wert das zuerst gesehene Original ist. Das Erstellen jedes Index ist ein linearer Durchgang. Dann wird jede Frage zu einer zeitkonstanten Suche pro Element: Ist dieser Schlüssel in B's Karte? Der gesamte Vergleich ist O (n+m), was bedeutet, dass zwanzigtausend Elemente auf jeder Seite vierzigtausend Hash-Operationen sind und schneller abgeschlossen werden, als der Browser neu malen kann.
Der gleiche Index gibt Duplikate kostenlos an Zählen Sie beim Erstellen Vorkommen pro Schlüssel; jeder Schlüssel mit einem Zählwert über eins wird innerhalb dieser Liste dupliziert Kein zweiter Durchgang, keine zusätzliche Struktur.
In der Praxis ist die Decke & #39; t der Vergleich - it& #39; s der Browser, der eine Ergebnisgruppe mit fünfzigtausend Zeilen in einen Textbereich einfügt Die Arithmetik endet unabhängig davon in Millisekunden Wenn Sie & #39; Listen, die so groß sind, routinemäßig abgleichen, möchten Sie dies wahrscheinlich in einem Skript und nicht in einer Registerkarte, und der obige Algorithmus umfasst etwa zehn Zeilen in jeder Sprache.
Sortieren ist eine Anmerkung wert Ergebnisse sind natürlich nach Standard sortiert, was numerisch-bewusst bedeutet: item2 vor item10Nicht danach. Einfache lexikografische Sortierung setzt item10 Zuerst weil 1 < 2 Zeichen für Zeichen, was durch den Buchstaben-der-Zeichenfolge-Vergleich korrekt und durch jede menschliche Erwartung beim Scannen von IDs oder versionierten Namen falsch ist, schalten Sie das Sortieren aus und Sie erhalten die Einfügungsreihenfolge - Elemente in der Reihenfolge, in der sie zuerst in A, dann in B erschienen sind - was gelegentlich das ist, was Sie wollen, wenn die ursprüngliche Reihenfolge so etwas wie Aktualität kodiert.
Wie sieht das in der Praxis aus?
Vier Szenarien, in denen I & #39; haben dies tatsächlich verwendet und jeweils einer anderen Ergebnisgruppe zugeordnet.
Bereinigen einer Mailingliste vor einem Versand. Fügen Sie die neue Liste und die zuvor gesendete Liste ein. Nur in A Ist wer hat't wurde kontaktiert - das's Ihre Sendeliste. In beiden ist wer'd ein Duplikat erhalten. Duplikate in A Ist die vierzig Personen aus der Geschichte oben auf dieser Seite Diese Überprüfung dauert fünfzehn Sekunden und it' ist diejenige, die dem Support-Ingenieur eine Stunde gespart hätte.
Zwei Systeme in Einklang bringen. Exportieren Sie Benutzer-E-Mails vom CRM in A und von der Abrechnung in B. Nur in A Abgemeldet ist, aber nie abgerechnet wird; Nur in B Abgerechnet-aber-fehlen-von-CRM. Das sind zwei verschiedene Bugs Der erste könnte ein kaputter Webhook sein, der zweite eine manuelle Rechnung, die jemand außerhalb des Flows erstellt hat Eine einzelne & quot; diese Listen different" Antwort würde das völlig verschleiern, genau deshalb werden beide Richtungen getrennt gemeldet.
Bestands- und Katalogdrift. Letzter Monat's SKU-Export gegen diesen Monat's. Nur in A eingestellt wird, wird Nur in B Neu ist, ist In beiden Übertragen wird Sortiermaterien hier - die Exporte kommen aus verschiedenen Systemen in unterschiedlicher Reihenfolge, und ein Diff würde die gesamte Datei als geändert melden.
Überprüfung der Einsatzsicherheit. Dateien zur Inszenierung im Vergleich zu Dateien zur Produktion, von zwei ls Ausgänge, die mit dem Leertasteparator eingefügt sind. Nur in A ist das, was & #39; noch nicht versendet.
Das Muster über alle vier: die nützliche Antwort ist fast nie & quot; die Listen sind unterschiedlich. & quot; It's welche Artikel, in welche Richtung - was genau das ist, was Ihnen festgelegte Operationen geben und was ein Ähnlichkeitswert oder eine Diff-Zusammenfassung tut't.
Werden meine Listen irgendwo hochgeladen?
Nein, und denken Sie eine Sekunde darüber nach, was Sie & #39;d in ein Werkzeug wie dieses einfügen.
It' s ein Abonnent exportieren Eine Liste von Kunden-E-Mails Mitarbeiter-IDs. Lizenzschlüssel Kontonummern Die Listen, die Menschen abgleichen, liegen ihrer Natur nach in der Nähe der sensibelsten Daten, die eine Organisation besitzt - Sie don' t Listen von Nichts abgleichen, Sie Listen von abgleichen MenschenUnd & quot; Lassen Sie mich diese zweitausend Kunden-E-Mails einfach in eine zufällige Website einfügen, um nach Überschneidungen zu suchen. & quot; ist ein Satz, der Sie davon abhalten sollte, denn in vielen Gerichtsbarkeiten ist & #39; ist eine Prozessorbeziehung, die Sie gerade ohne Vertrag erstellt haben.
There's kein Grund für diese Berechnung, ein Netzwerk zu berühren It's hash maps over strings - ein paar hundert Zeilen abhängigkeitsfreies TypeScript Das Tool auf Toolz.dev läuft vollständig in Ihrem Tab; die Listen sind JavaScript-Strings in Ihrem Browser's-Speicher und sie verlassen ihn nie Nichts wird hochgeladen, protokolliert oder gespeichert Überprüfen Sie es so, wie Sie & #39;d eine solche Behauptung überprüfen: Öffnen Sie die Netzwerkkarte und drücken Sie auf Vergleichen, oder schalten Sie Ihr WLAN aus und beobachten Sie, wie es weiter funktioniert. I #39; habe mehr darüber geschrieben, warum diese Architektur genau für diese Datenklasse wichtig ist Warum Browser-basierte Tools serverseitige schlagendrohen
FAQ
Wie vergleiche ich zwei Listen, um herauszufinden, was sie gemeinsam haben?
Fügen Sie eine Liste in Liste A ein, die andere in Liste B und drücken Sie Vergleichen Die & quot; Gruppe ist in Both" die Schnittmenge - jedes in beiden Listen vorhandene Element Sie können diese Gruppe für sich kopieren, als Textdatei herunterladen oder jede Gruppe auf einmal mit Copy Report exportieren. Bestellung macht ' nichts, also müssen die Listen don' nicht auf die gleiche Weise sortiert werden.
Wie finde ich Elemente, die in einer Liste enthalten sind, aber nicht in der anderen?
Das & quot; Nur in A & quot; und & quot; Nur in B & quot; Gruppen beantworten das, und sie're trennen sich bewusst Nur in A fehlen Elemente in Liste B; Nur in B fehlen Elemente in Liste A. Dies sind normalerweise unterschiedliche Probleme mit unterschiedlichen Ursachen - fehlendes aus der Abrechnung und fehlendes aus CRM sind & #39; t derselbe Fehler - so dass das Zusammenklappen in eine Antwort die Informationen verliert, die Sie benötigen. Die & quot; Unique" Gruppe kombiniert beides, wenn Sie den symmetrischen Unterschied wünschen.
Kann es Duplikate in einer einzigen Liste finden?
Ja. Duplikate in A und Duplikate in B listen jedes einzelne Element auf, das mehr als einmal innerhalb dieser Liste erscheint. Dies ist unabhängig vom Listenvergleich, sodass ein Element sowohl in A dupliziert als auch in B vorhanden sein kann. It's normalerweise die Prüfung, die in der Praxis am wichtigsten ist, da Duplikate innerhalb der Liste doppelte E-Mails und Doppelabrechnungen verursachen.
Beeinflusst die Kapitalisierung den Vergleich?
Nur wenn Sie es möchten Fallsensitives Matching ist standardmäßig deaktiviert, also [email protected] und [email protected] Werden als ein Element behandelt - und die Ausgabe behält das Formular bei, das Sie eingefügt haben, anstatt Ihre Daten zu verkleinern Schalten Sie es für Werte ein, bei denen der Fall Bedeutung hat: Linux-Pfade, Basis-64-Strings, Hashes, API-Schlüssel, Git-SHAs.
Was' Ist der Unterschied zwischen diesem und einem Textdiff-Tool?
Ein Diff ist positionell: Es vergleicht Zeile 1 mit Zeile 1 und berechnet die Bearbeitungen, die erforderlich sind, um eine Sequenz in die andere umzuwandeln. Durch die Neuordnung einer Liste wird also fast jede Zeile verändert. Dieses Tool ignoriert die Reihenfolge vollständig und fragt nur, ob auf jeder Seite ein Element vorhanden ist Verwenden Sie ein Diff für Code und Prosa, wenn die Position eine Bedeutung hat; Verwenden Sie List Compare zum Abgleichen von Exporten, bei denen die Sortierreihenfolge willkürlich ist.
Kann ich Listen, die durch Kommas getrennt sind, anstelle von neuen Zeilen vergleichen?
Ja - schalten Sie das Trennzeichen auf Komma, Semikolon, Leerzeichen oder Registerkarte. Der Leerraum um jedes Element wird standardmäßig gekürzt, also a, b, c Teilt sich in drei saubere Elemente. Eine Einschränkung: Aufteilen auf Kommas ist' t echtes CSV-Parsing. Wenn Ihre Daten also Felder mit Kommas angegeben haben, extrahieren Sie die Spalte zuerst mit einem geeigneten CSV-Tool.
Wie viele Artikel kann es verarbeiten?
Der Vergleich indiziert jede Liste in einer Hash-Karte und läuft in linearer Zeit, anstatt verschachtelte Schleifen zu verwenden, sodass Zehntausende Elemente auf jeder Seite in Millisekunden abgeschlossen sind. Die praktische Obergrenze besteht darin, dass Ihr Browser eine sehr große Ergebnisgruppe in die Seite einfügt, nicht der Vergleich selbst.
Werden meine Listen irgendwo hochgeladen?
Nein. Jegliches Parsen und Vergleichen geschieht als JavaScript in Ihrem Browser - nichts wird übertragen, protokolliert oder gespeichert. Dies ist hier wichtiger als bei den meisten Tools, denn die Listen, die die Leute abgleichen, sind normalerweise Kunden-E-Mails, Mitarbeiter-IDs oder Lizenzschlüssel Beobachten Sie Ihren Netzwerk-Tab beim Vergleichen, oder gehen Sie offline und es funktioniert weiter.
Verwandte Werkzeuge: Text Diff Checker Wenn Ordnung und Position wichtig sind, json diff Für strukturierte Daten, CSV-Betrachter Zum Extrahieren einer Spalte aus einer echten CSV und Wortzähler Für schnelle Zählungen. Weiterlesen: Warum Browser-basierte Tools serverseitige schlagen und Das Toolkit des Webentwicklersdrohen



