Een support engineer vroeg me ooit waarom veertig klanten twee keer een vernieuwingsmail hadden ontvangen Het antwoord duurde een uur om te vinden en was volkomen alledaags: de campagnelijst was samengesteld door de ene export onder de andere te plakken, en in beide bestonden veertig adressen. Niemand had het gecontroleerd, omdat controleren betekende dat je tweeduizend rijen moest bekijken of een VLOOKUP dat de helft van het team dat deed 't vertrouwen Dus niemand controleerde het, en dezelfde veertig mensen kregen twee keer te horen dat hun kaart op het punt stond in rekening te worden gebracht.
Dat is de vorm van dit probleem Het combineren van twee lijsten is een van de meest voorkomende dingen die iemand met gegevens doet, en het & #39; is saai genoeg dat mensen het overslaan of slecht doen. Het instinct is meestal om naar een diff-tool te grijpen, beide lijsten in te plakken en naar de gekleurde uitvoer te knijpen - wat onmiddellijk mislukt, omdat een diff een vraag beantwoordt die je hebt gesteld & #39;t vraag. Of je gaat naar een spreadsheet en begint met assembleren MATCH/COUNTIF formules, die werken maar tien minuten duren en een artefact produceren dat u ' nooit opnieuw zult gebruiken.
De bewerking die u eigenlijk wilt heeft een naam en it' s ouder dan een van de tools: rekenkunde instellen Intersectie, verschil, unie Ik bouw [Toolz.dev] (/en zet een browser-based tool voor het vergelijken van lijsten daar, maar deze gids gaat over de concepten eronder - waarom de volgorde genegeerd moet worden, welke zaak het vouwen stilletjes breekt en hoe je kunt kiezen tussen dit en een diff.
tl;dr: Om twee lijsten te vergelijken, behandel je ze elk als een ongeordende set en bereken je het snijpunt (items in beide), de twee verschillen (items alleen in A, items alleen in B) en de duplicaten binnen elke lijst Negeer bestelling volledig - een lijndiff is het verkeerde hulpmiddel omdat het ' s positioneel is, dus door een lijst opnieuw te ordenen, ziet bijna elke rij er veranderd uit. Vouw case voor identificatiegegevens zoals e-mails, maar behoud de originele tekst in de uitvoer, trim witruimte voordat u deze vergelijkt en doe dit in de browser, aangezien de lijsten die mensen met elkaar verzoenen meestal klantgegevens zijn.
Welke vragen beantwoordt het vergelijken van twee lijsten eigenlijk?
Zodra u de genoemde bewerkingen ziet, worden de vormen duidelijk. Gegeven lijst A en lijst B:
- Intersectie- wat's in beide? welke abonnees zijn ook betalende klanten Welke van vorige maand' s SKU's zijn nog steeds in deze maand' s catalogus.
- Een min B- wat' s alleen in A? welke gebruikers in de CRM hebben nooit de facturering gehaald Welke bestanden bestaan lokaal maar niet op de server.
- B min A- wat's alleen in B? Dezelfde vraag in de andere richting, en het's a uiteenlopen vraag. Ontbrekend van facturering en ontbrekend van CRM zijn twee verschillende bugs met twee verschillende oorzaken.
- Symmetrisch verschil- wat' s in precies één lijst? De vereniging van beide verschillen: alles wat niet overeenkwam, ongeacht de richting Dit is de "wat's niet synchroon?" vraag.
- Union- alles uit beide lijsten, gededupliceerd. De samenvoeging, correct uitgevoerd.
- Dupliceert binnen een lijst- wat' wordt alleen in A herhaald? Deze is ' helemaal geen vergelijking, maar het ' is altijd de vraag die je nodig blijkt te hebben, omdat het 's wat dubbele verzendingen en dubbele facturering veroorzaakt.
Die laatste is het uit elkaar halen waard Cross-list matching en binnen-list duplicatie zijn onafhankelijk: een adres kan twee keer in A voorkomen en ook verschijnen in B. Tools die alleen resultaten op de cross-list rapporteren, missen de mislukking die geld kost.
Alles hier wordt rechtstreeks toegewezen aan bewerkingen die u al kent van SQL - INTERSECT, EXCEPT, UNION- en op spreadsheetformules De waarde van een speciaal hulpmiddel is't dat het iets doet wat je kunt't; het's dat alle zes antwoorden verschijnen vanuit één plak, in plaats van zes verschillende formules.
Waarom is een diff tool de verkeerde keuze voor het vergelijken van lijsten?
Dit is de fout die ik het meest zie, en it' s die de moeite waard zijn om precies over te zijn, omdat " vergelijk twee lijsten" en "diff twee bestanden" klinken als synoniemen.
Een diff is positioneel. Diff-algoritmen berekenen het minimale bewerkingsscript - de kortste reeks invoegingen en verwijderingen die de ene reeks in de andere verandert. Dat' is het juiste model voor broncode en proza, waar regel 40 na regel 39 staat betekenisvol. Een functie verplaatsen en een diff rapporteert correct dat u een functie hebt verplaatst.
Een lijst heeft geen betekenisvolle volgorde. Rij 300 in uw CRM-export heeft geen enkele relatie met rij 300 in uw factuurexport. Zij' zijn twee zakken met artikelen die toevallig worden opgeschreven in welke volgorde de database ook retourneert.
Voer ongeordende gegevens naar een positioneel algoritme en je krijgt ruis Neem twee lijsten met identieke inhoud, sorteer er één en verspreid ze:
List A List B
alice bob
bob alice
carol carol
Een diff meldt dat alice is verwijderd en opnieuw toegevoegd, of dat bob verplaatst - sommige churn evenredig met hoe verschillend de twee zijn gesorteerd Het juiste antwoord is niets veranderd. Elk item staat in beide lijsten De sets zijn gelijk Een diff can't zeg dat omdat het is't vragen naar lidmaatschap.
De vergelijkingstabel, aangezien de tools elkaar echt overlappen in de hoofden van mensen die naar beide zoeken:
| Lijst Vergelijk | tekst diff | |
|---|---|---|
| Model | Ongeordende set items | Geordende volgorde van lijnen |
| Bestelzaken? | Nee - vrij opnieuw ordenen, resultaten identiek | Ja - shows herschikken als wijzigingen |
| Antwoorden | Lidmaatschap: in beide gevallen wordt alleen A, alleen B, gedupliceerd | Bewerkingen: wat moet u invoegen/verwijderen om A in B te transformeren |
| Items dupliceren | Als groep expliciet gerapporteerd | Gewoon meer lijnen |
| goed voor | Exports, e-maillijsten, ID's, SKU's, voorraden met elkaar verzoenen | Broncode, proza, configuratiebestanden, alles waar positie betekenis heeft |
| Slecht voor | Twee versies van een document vergelijken | Elke lijst waar de sorteervolgorde willekeurig is |
De regel: als u ' even blij zou zijn met de lijst die anders is gesorteerd, wilt u een vaste vergelijking. Als het herschikken van de lijnen een echte verandering zou zijn die de moeite waard is om te rapporteren, wil je de tekst diff checker. Voor gestructureerde gegevens met nesting in plaats van vlakke lijnen is geen van beide van toepassing - dat's wat de JSON-differentiatie is voor, omdat het zich verhoudt per sleutelpad in plaats van per lijn of per lidmaatschap.
Hoe moet case sensitiviteit werken?
Dit is de optie die mensen standaard verlaten en dan stilletjes fout gaan, dus het is ' het is de moeite waard om er een keer over na te denken.
Case-insensitive matching is de juiste standaard voor de gegevens die de meeste mensen vergelijken E-mailadressen, gebruikersnamen, domeinnamen, productcodes, landcodes - deze zijn conventioneel case-insensitive in de praktijk, en [email protected] en [email protected] zijn dezelfde persoon in elk systeem dat ertoe doet.
There' is een pedant voorbehoud hier dat's de moeite waard om te weten omdat het's af en toe dragend: per RFC-5321, het domeingedeelte van een e-mailadres is hoofdletterongevoelig, maar de local deel - alles vóór de @- is formeel hoofdlettergevoelig en wordt aan de ontvangende mailserver overgelaten om te interpreteren Dus [email protected] en [email protected] kunnen in principe verschillende mailboxen zijn In de praktijk behandelt in wezen elke grote provider ze als identiek, en als u ' een mailinglijst opnieuw dupliceert, moet u absoluut de naamval vouwen. Maar als u ' debugt waarom een specifiek adres stuitert, dan is dat ' is het soort detail dat er toe blijkt te doen.
Geval-sensitive matching is correct voor alles waar case informatie draagt: Linux bestandspaden, base64 strings, hashes, JWT tokens, API sleutels, Git SHA's, de meeste programmeer-ID's Vouw case op een lijst van wachtwoord hashes zou verschillende waarden samenvoegen en u een vol vertrouwen verkeerd antwoord geven.
Het uitvoeringsdetail dat er meer toe doet dan de optie zelf: vouw case voor matching, maar toon de originele tekst. Als je plakt [email protected] en de tool vertelt je dat het ' in beide lijsten moet het teruggeven [email protected]- niet [email protected]. Het verlagen van de uitvoer corrumpeert stil uw gegevens op de doorreis, en aangezien de gebruikelijke volgende stap is het ergens anders plakken van het resultaat, reist die corruptie. De tool behoudt de eerst geziene vorm van elk item en komt overeen met een opgevouwen sleutel achter de schermen, dus wat eruit komt, is wat je erin stopt.
Whitespace verdient dezelfde behandeling en krijgt minder aandacht Kopieer een kolom uit een spreadsheet, of splits een lijn als a, b, c op komma's, en je krijgt items met leidende spaties. [email protected] en [email protected] zijn verschillende tekenreeksen en identieke adressen Om die reden is het trimmen standaard ingeschakeld, en het' is de optie die u ' d binnen ongeveer dertig seconden na echt gebruik mist.
Welk scheidingsteken moet ik gebruiken?
De standaardwaarde is één item per regel, dat is wat u krijgt bij het plakken van een spreadsheetkolom: het klembord geeft door nieuwe regels gescheiden waarden door, dus een kolom met e-mails van Excel, Google Sheets of een CSV-export komt binnen zonder opnieuw formatteren.
De andere scheidingstekens dekken gegevens die al inline aankomen Komma voor een enkele CSV-rij of een gekopieerde array Semicolon voor de Outlook en oudere-Windows-conventie voor adreslijsten Ruimte voor shell-uitvoer - ls, git diff --name-only doorgesluisd tr, alles wat in de ruimte is gescheiden Tab voor een rij die horizontaal in plaats van verticaal uit een spreadsheet is geplakt.
Een ding om op te merken: splitsen op komma's is nee CSV parseren Een echt CSV veld kan een komma bevatten binnen aanhalingstekens, en een naïeve splitsing zal scheuren "Smith, Jane" in twee items Als u ' één kolom uit een echt CSV-bestand met geciteerde velden haalt, voert u deze uit via de CSV-kijker eerst - het implementeert de werkelijke RFC 4180 citeerregels - kopieer vervolgens de kolom die u wilt Voor een platte lijst van e-mails of ID's zonder ingebedde komma's, splitsen is prima en dit doet ' t komen.
Lege vermeldingen worden standaard verwijderd, omdat ze ' zijn bijna altijd artefacten: een achterliggende nieuwe regel aan het einde van een pasta, een lege rij in een spreadsheet, een dubbele komma Een lege tekenreeks is & # 39; een item in elke lijst waar u daadwerkelijk om geeft De optie bestaat als u & # 39; specifiek op zoek bent naar lege rijen in een export, wat echt, maar ongebruikelijk is om te willen.
Hoe schaalt de vergelijking?
De naïeve benadering voor het vergelijken van twee lijsten is een geneste lus: scan voor elk item in A heel B. That's O (n×m), en it' is prima voor honderd items en onbruikbaar voor vijftigduizend, waarbij je ' 2,5 miljard tekenreeksvergelijkingen doet.
De juiste benadering indexeert elke lijst in een hashmap die is ingetoetst door de vergelijkingssleutel - de gevouwen, bijgesneden vorm van het item - waarbij de waarde het eerst vertoonde origineel is Het bouwen van elke index is één lineaire pass Dan wordt elke vraag een constante-tijd opzoeken per item: is deze sleutel in B' s kaart? De hele vergelijking is O (n+m), wat betekent dat twintigduizend items aan elke kant veertigduizend hash-bewerkingen zijn en sneller voltooid zijn dan de browser opnieuw kan schilderen.
Dezelfde index geeft gratis duplicaten Tel voorvallen per sleutel tijdens het bouwen; elke sleutel met een telling boven één wordt binnen die lijst gedupliceerd Geen tweede doorgang, geen extra structuur.
In de praktijk is het plafond & #39; t de vergelijking - it& #39; s de browser die een resultaatgroep met vijftigduizend rijen in een tekstgebied weergeeft De rekenkunde eindigt in milliseconden hoe dan ook Als u & #39; routinematig lijsten afstemt die zo groot zijn, wilt u dit waarschijnlijk in een script in plaats van in een tabblad, en het bovenstaande algoritme is ongeveer tien regels in elke taal.
Sorteren is een notitie waard Resultaten worden standaard natuurlijk gesorteerd, dat wil zeggen numeriek-bewust: item2 vooruit item10, niet erna Effen lexicografische sortering zet item10 eerst omdat 1 < 2 karakter voor karakter, wat correct is door de letter van de tekenreeks vergelijking en fout door elke menselijke verwachting bij het scannen van ID's of versioned namen Zet sorteren uit en je krijgt invoegvolgorde - items in de reeks ze eerst verschenen in A, dan B - die af en toe is wat je wilt wanneer de oorspronkelijke volgorde codeert zoiets als recentheid.
Hoe ziet dit er in de praktijk uit?
Vier scenario's waarin I' hebben dit daadwerkelijk gebruikt, elk toegewezen aan een andere resultaatgroep.
Een mailinglijst opschonen vóór een verzending. Plak de nieuwe lijst en de eerder verzonden lijst. Alleen in A is wie heeft' Er is contact opgenomen met - dat' is uw verzendlijst. In beide is wie'd krijg een duplicaat. Duplicaten in A staat de veertig mensen uit het verhaal bovenaan deze pagina Die controle duurt vijftien seconden en het & #39; is degene die de support engineer een uur zou hebben bespaard.
Het verzoenen van twee systemen. Exporteer gebruikers-e-mails van de CRM naar A en van facturering naar B. Alleen in A is aangemeld, maar nooit gefactureerd; alleen in B is gefactureerd-maar-ontbrekend-van-CRM Dit zijn twee verschillende bugs De eerste kan een kapotte webhook zijn, de tweede kan een handmatige factuur zijn die iemand buiten de stroom heeft opgewekt Een enkele & quot; deze lijsten verschillen" antwoord zou dat volledig verdoezelen, en dat is precies de reden waarom beide richtingen afzonderlijk worden gerapporteerd.
Inventaris en catalogusdrift. Vorige maand's SKU-export tegen deze maand's. Alleen in A wordt stopgezet, alleen in B is nieuw, in beide wordt overgedragen Sorteerzaken hier - de export komt uit verschillende systemen in verschillende orders, en een diff zou het hele bestand als gewijzigd rapporteren.
Controles op gezond verstand van de inzet. Bestanden over enscenering versus bestanden over productie, van twee ls uitgangen geplakt met de ruimtescheider. Alleen in A is wat heeft't nog verzonden.
Het patroon voor alle vier: het nuttige antwoord is bijna nooit & quot; de lijsten zijn anders." Het's die artikelen, in die richting - dat is precies wat ingestelde bewerkingen je geven en wat een gelijkenisscore of een diff-samenvatting doet't.
Zijn mijn lijsten ergens geüpload?
Nee, en denk even na over wat je ' d plakt in een tool als deze.
It' is een abonnee-export. Een lijst met e-mails van klanten. Identiteitsbewijzen van werknemers. Licentiesleutels. Accountnummers. De lijsten die mensen met elkaar verzoenen liggen door hun aard dicht bij de meest gevoelige gegevens die een organisatie bewaart: u don't verzoent lijsten met niets, u verzoent lijsten met people. En " laat me deze tweeduizend e-mails van klanten gewoon in een willekeurige website plakken om te controleren op overlap" is een zin die je koud zou moeten houden, omdat in veel rechtsgebieden dat' een processorrelatie is die je zojuist hebt gemaakt zonder contract.
There's geen reden voor deze berekening om een netwerk aan te raken It' s hash maps over strings - een paar honderd regels afhankelijkheidsvrij TypeScript De tool op Toolz.dev draait volledig in uw tabblad; de lijsten zijn JavaScript strings in uw browser' s geheugen en ze verlaten het nooit Niets wordt geüpload, gelogd of opgeslagen Verifieer het zoals u ' d verifieer een dergelijke claim: open het netwerktabblad en druk op Vergelijken, of zet uw wifi uit en kijk hoe het blijft werken I ' heb meer geschreven over waarom deze architectuur er toe doet voor precies deze klasse van gegevens in Waarom browsergebaseerde tools de server-side verslaan.
FAQ
Hoe vergelijk ik twee lijsten om te ontdekken wat ze gemeen hebben?
Plak de ene lijst in Lijst A, de andere in Lijst B, en druk op Vergelijken De & quot; In Both" groep is het snijpunt - elk item dat in beide lijsten aanwezig is U kunt die groep zelf kopiëren, downloaden als tekstbestand, of elke groep tegelijk exporteren met Kopieerrapport Bestel doet ' maakt niet uit, dus de lijsten don't hoeven op dezelfde manier gesorteerd te worden.
Hoe vind ik items die in de ene lijst staan, maar niet in de andere?
De " Alleen in A & quot; en & quot; Alleen in B & quot; groepen antwoorden daarop, en zij & # 39; zijn opzettelijk gescheiden Alleen in A houdt items vast die ontbreken in Lijst B; Alleen in B worden items bewaard die ontbreken in Lijst A. Dit zijn meestal verschillende problemen met verschillende oorzaken - missing-from-billing en missing-from-CRM aren't dezelfde bug - dus door ze in één antwoord samen te voegen, verliest u de informatie die u nodig heeft De & quot; Unique" groep combineert beide als u het symmetrische verschil wilt.
Kan het duplicaten in een enkele lijst vinden?
Ja. Duplicaten in A en duplicaten in B vermelden elk afzonderlijk item dat meer dan één keer in die lijst voorkomt. Dit is onafhankelijk van cross-list matching, dus een item kan zowel worden gedupliceerd in A als aanwezig in B. It' is meestal de cheque die er in de praktijk het meest toe doet, aangezien duplicaten binnen de lijst dubbele e-mails en dubbele facturering veroorzaken.
Heeft kapitalisatie invloed op de vergelijking?
Alleen als je dat wilt Gevalgevoelige matching is standaard uitgeschakeld, dus [email protected] en [email protected] worden behandeld als één item - en de uitvoer behoudt welke vorm u ook hebt geplakt in plaats van uw gegevens te verlagen Schakel het in voor waarden waar case betekenis heeft: Linux-paden, base64-strings, hashes, API-sleutels, Git SHA's.
Wat' Is het verschil tussen dit en een tekstdiff-tool?
Een diff is positioneel: het vergelijkt regel 1 met regel 1 en berekent de bewerkingen die nodig zijn om de ene reeks in de andere te veranderen, dus door een lijst opnieuw te ordenen, ziet bijna elke regel er veranderd uit. Dit hulpmiddel negeert de volgorde volledig en vraagt alleen of er aan elke kant een item bestaat. Gebruik een diff voor code en proza waarbij positie betekenis heeft; gebruik lijstvergelijking voor het afstemmen van exports waarbij de sorteervolgorde willekeurig is.
Kan ik lijsten met elkaar vergelijken, gescheiden door komma's in plaats van nieuwe regels?
Ja - schakel het scheidingsteken naar komma, puntkomma, spatie of tabblad Witruimte rond elk item wordt standaard bijgesneden, dus a, b, c splitst zich in drie schone items Eén voorbehoud: splitsen op komma's isn't echte CSV-parsering, dus als uw gegevens velden hebben geciteerd die komma's bevatten, extraheer dan eerst de kolom met een goed CSV-hulpmiddel.
Hoeveel items kan het aan?
De vergelijking indexeert elke lijst in een hashkaart en wordt in lineaire tijd uitgevoerd in plaats van geneste lussen te gebruiken, dus tienduizenden items aan elke kant zijn in milliseconden voltooid. Het praktische plafond is dat uw browser een zeer grote resultaatgroep in de pagina weergeeft, niet de vergelijking zelf.
Zijn mijn lijsten ergens geüpload?
Nee Alle parseren en vergelijken gebeurt als JavaScript in uw browser - niets wordt verzonden, gelogd of opgeslagen Dit is hier belangrijker dan voor de meeste tools, omdat de lijsten die mensen met elkaar verzoenen meestal e-mails van klanten, werknemers-ID's of licentiesleutels zijn Bekijk uw netwerktab tijdens het vergelijken, of ga offline en het blijft werken.
Verwante hulpmiddelen: tekst diff checker Wanneer orde en positie ertoe doen, JSON-differentiatie Voor gestructureerde gegevens, CSV-kijker voor het extraheren van een kolom uit een echte CSV, en woord teller voor snelle tellingen. Verder lezen: Waarom browsergebaseerde tools de server-side verslaan en De toolkit van de webontwikkelaar.



