Un ingénieur support m'a demandé un jour pourquoi quarante clients avaient reçu deux fois un e-mail de renouvellement La réponse a pris une heure à trouver et était complètement banale : la liste de campagne avait été assemblée en collant une exportation sous une autre, et quarante adresses existaient dans les deux Personne n'avait vérifié, car vérifier signifiait soit regarder deux mille rangées ou écrire une VLOOKUP cette moitié de l'équipe a fait confiance. Donc personne n'a vérifié, et les quarante mêmes personnes ont été informées à deux reprises que leur carte était sur le point d'être débitée.
C'est la forme de ce problème La réconciliation de deux listes est l'une des choses les plus courantes que l'on fasse avec les données, et c'est assez ennuyeux pour que les gens le sautent ou le fassent mal. L'instinct est généralement de rechercher un outil de comparaison, de coller les deux listes et de plisser les yeux vers la sortie colorée - ce qui échoue immédiatement, car une différence répond à une question que vous avez posée et que vous n°39 ; pas poser. Ou vous allez sur une feuille de calcul et commencez à assembler MATCH/COUNTIF formules, qui fonctionne mais prend dix minutes et produit un artefact que vous et #39 ; ne réutilisera jamais.
L'opération que vous voulez réellement a un nom et it' ;s plus ancien que n'importe lequel des outils : définir l'arithmétique Intersection, différence, union. Je construis [Toolz.dev] (/et mets un navigateur-based outil de comparaison de listes là, mais ce guide parle des concepts en dessous : pourquoi l'ordre doit être ignoré, quel pliage de boîtier se brise tranquillement et comment choisir entre ceci et un diff.
tl;dr : Pour comparer deux listes, traitez chacune comme un ensemble non ordonné et calculez l'intersection (éléments dans les deux), les deux différences (éléments uniquement dans A, éléments uniquement dans B) et les doublons dans chaque liste. Ignorez entièrement l'ordre - une ligne diff n'est pas le bon outil car la position de it' ;, donc réorganiser une liste donne l'impression que presque toutes les lignes sont modifiées. Plier le cas des identifiants comme les e-mails mais conserver le texte original dans la sortie, réduire les espaces avant de comparer et le faire dans le navigateur puisque les listes que les gens réconcilient sont généralement des données client.
À quelles questions la comparaison de deux listes répond-elle réellement ?
Une fois que vous voyez les opérations nommées, les formes deviennent évidentes. Compte tenu de la liste A et de la liste B :
- Intersection- quoi' ; dans les deux ? Quels abonnés paient également des clients. Lequel des SKU du mois dernier et du n°39 ; s sont toujours dans ce catalogue du mois et du n°39 ;s.
- Un moins B- quoi' ; s seulement dans A ? Quels utilisateurs dans le CRM n'ont jamais fait en facturation Quels fichiers existent localement mais pas sur le serveur.
- B moins A- quoi' ;s uniquement en B ? La même question dans l'autre sens, et c'est & #39 ; est un différent question. Les erreurs de facturation et les erreurs de facturation sont deux bugs distincts avec deux causes distinctes.
- Différence symétrique- quoi' ; s dans exactement une liste ? L'union des deux différences : tout ce qui n'a pas réussi à correspondre, quelle que soit la direction C'est le " ; quoi' ; s désynchronisé ?" ; question.
- Union- tout dans l'une ou l'autre liste, dédupliqué La fusion, effectuée correctement.
- Dupliques dans une liste- quoi' ; est répété dans A seul ? Celui-ci est ' ; une comparaison du tout, mais il & #39 ; c'est toujours la question dont vous vous êtes avéré avoir eu besoin, car c'est & #39 ; c'est ce qui cause les doubles envois et la double facturation.
Ce dernier mérite d'être séparé. La correspondance entre listes et la duplication au sein de la liste sont indépendantes : une adresse peut apparaître deux fois dans A et apparaissent également dans B. Les outils qui ne rapportent que les résultats de liste croisée manquent l'échec qui coûte de l'argent.
Tout ici est directement mappé sur les opérations que vous connaissez déjà depuis SQL - INTERSECT, EXCEPT, UNION- et sur les formules de tableur La valeur d'un outil dédié est & #39 ; t qu'il fait quelque chose que vous pouvez & #39 ; t ; it & #39 ; s que les six réponses apparaissent à partir d'une seule pâte, au lieu de six formules différentes.
Pourquoi un outil de comparaison n’est-il pas le bon choix pour comparer des listes ?
C'est l'erreur que je vois le plus, et c'est & #39 ; cela vaut la peine d'être précis, car " ; comparer deux listes" ; et " ;diff deux fichiers" ; ressemblent à des synonymes.
Un diff est positionnel. Les algorithmes de diffusion calculent le script d'édition minimum - la séquence d'insertions et de suppressions la plus courte qui transforme une séquence en une autre. That' ; est le bon modèle pour le code source et la prose, où se trouve la ligne 40 suivant la ligne 39 significatif. Déplacer une fonction et un diff rapporte correctement que vous avez déplacé une fonction.
Une liste n'a pas d'ordre significatif. La ligne 300 de votre export CRM n'a aucun rapport avec la ligne 300 de votre exportation de facturation. Ils et n°39 ; sont deux sacs d'articles qui sont écrits dans n'importe quelle séquence renvoyée par la base de données.
Alimentez les données non ordonnées vers un algorithme de position et vous obtenez du bruit Prenez deux listes avec des contenus identiques, triez l'une d'entre elles et diffez-les :
List A List B
alice bob
bob alice
carol carol
Une différence rapporte cela alice a été retiré et réajouté, ou ça bob déplacé - un désabonnement proportionnel à la façon dont les deux sont triés différemment La bonne réponse est rien changé. Chaque élément est dans les deux listes Les ensembles sont égaux A diff can' ; t dire que parce que c'est ' ; t poser des questions sur l'adhésion.
Le tableau de comparaison, puisque les outils se chevauchent véritablement dans l’esprit des personnes à la recherche des deux :
| Liste Comparer | Diff de texte | |
|---|---|---|
| Modèle | Ensemble d'éléments non ordonné | Séquence ordonnée de lignes |
| L'ordre compte? | Non - réorganiser librement, résultats identiques | Oui - réorganiser les émissions en fonction des changements |
| Réponses | Adhésion : dans les deux cas, seulement A, seulement B, dupliqué | Modifications : que insérer/supprimer pour transformer A en B |
| Articles dupliqués | Signalé explicitement en tant que groupe | Juste plus de lignes |
| bien pour | Concilier exportations, listes de diffusion, identifiants, SKU, inventaires | Code source, prose, fichiers de configuration, tout ce que signifie la position |
| Mauvais pour | Comparaison de deux versions d'un document | Toute liste où l'ordre de tri est arbitraire |
La règle: si vous et n°39 ; seriez également satisfait de la liste triée différemment, vous souhaitez une comparaison définie. Si la réorganisation des lignes serait un véritable changement qui mérite d'être signalé, vous voulez le Vérificateur de différentiel de texte. Pour les données structurées avec des lignes imbriquées plutôt que plates, aucune ne s'applique - cela' ; c'est quoi le Diff JSON est pour, puisqu'il compare par chemin clé plutôt que par ligne ou par adhésion.
Comment la sensibilité aux cas doit-elle fonctionner ?
C'est l'option que les gens laissent par défaut, puis se trompent discrètement, donc ça vaut la peine de réfléchir une fois.
La correspondance insensible à la casse est la bonne valeur par défaut pour les données comparées par la plupart des gens Adresses e-mail, noms d'utilisateur, noms de domaine, codes de produits, codes de pays - ceux-ci sont classiquement insensibles à la casse dans la pratique, et [email protected] et [email protected] sont la même personne dans chaque système qui compte.
Il y a & #39 ; c'est une mise en garde pédante ici que & #39 ; vaut la peine d'être connu parce que c'est & #39 ; est parfois porteur : par RFC5321(traduction), la partie domaine d'une adresse e-mail est insensible à la casse, mais le local partie - tout avant le @- est formellement sensible à la casse et laissé au serveur de messagerie récepteur pour interpréter. Donc [email protected] et [email protected] pourrait en principe être différentes boîtes aux lettres En pratique, pratiquement tous les principaux fournisseurs les traitent comme identiques, et si vous et le numéro 39 ; dédupliquez une liste de diffusion, vous devriez absolument plier la casse. Mais si vous et le numéro 39 ; re déboguer pourquoi une adresse spécifique rebondit, ce numéro 39 ; c'est le genre de détail qui s'avère important.
Cas-sensible la correspondance est correcte pour tout ce qui concerne le cas où le cas transporte des informations : chemins de fichiers Linux, chaînes de base 64, hachages, jetons JWT, clés API, Git SHA, la plupart des identifiants de programmation Le pli sur une liste de hachages de mots de passe fusionnerait des valeurs distinctes et vous donnerait une mauvaise réponse en toute confiance.
Le détail de mise en œuvre qui compte plus que l'option elle-même : pliez le boîtier pour faire correspondre, mais affichez le texte original. Si vous collez [email protected] et l'outil vous le dit' ; dans les deux listes, il devrait rendre [email protected]- pas [email protected]. La mise en sous-case de la sortie corrompt silencieusement vos données en cours de route, et comme l'étape suivante habituelle consiste à coller le résultat ailleurs, cette corruption se propage. L'outil conserve la forme première vue de chaque élément et correspond à une clé pliée dans les coulisses, donc ce qui sort est ce que vous mettez dedans.
Whitespace mérite le même traitement et fait moins réfléchir Copiez une colonne d'une feuille de calcul ou divisez une ligne comme a, b, c sur les virgules, et vous obtenez des objets transportant des espaces principaux. [email protected] et [email protected] sont différentes chaînes et adresses identiques Le rognage est activé par défaut pour cette raison, et it' ; est l'option que vous et #39 ; d remarquez manquante dans les trente secondes environ suivant l'utilisation réelle.
Quel séparateur dois-je utiliser ?
La valeur par défaut est d'un élément par ligne, c'est-à-dire ce que vous obtenez en collant une colonne de feuille de calcul : le presse-papiers transmet les valeurs séparées par de nouvelles lignes, de sorte qu'une colonne d'e-mails d'Excel, de Google Sheets ou d'une exportation CSV arrive sans reformatage.
Les autres séparateurs couvrent les données qui arrivent déjà en ligne Comma pour une seule ligne CSV ou un tableau copié Semicolon pour la convention Outlook et older-Windows pour les listes d'adresses Space for shell output - ls, git diff --name-only traversé tr[TRADUCTION], tout ce qui est délimité par l'espace Onglet pour une ligne collée à partir d'une feuille de calcul horizontalement plutôt que verticalement.
Une chose à noter : se diviser sur les virgules, c'est non Analyse CSV. Un vrai champ CSV peut contenir une virgule à l'intérieur des guillemets, et un split naïf se déchirera "Smith, Jane" en deux éléments. Si vous et n°39 ; retirez une colonne d'un véritable fichier CSV avec des champs cités, exécutez-la via le Visionneuse CSV tout d'abord - il implémente les règles de citation réelles de la RFC 4180 - puis copiez la colonne que vous souhaitez. Pour une liste plate d'e-mails ou d'identifiants sans virgules intégrées, le fractionnement est correct et cela ne correspond pas à & #39 ; t arrive.
Les entrées vides sont supprimées par défaut, car elles et n°39 ; sont presque toujours des artefacts : une nouvelle ligne arrière à la fin d'une pâte, une ligne vierge dans une feuille de calcul, une double virgule. Une chaîne vide est & n°39 ; un élément dans n'importe quelle liste qui vous intéresse réellement. L'option existe si vous et n°39 ; recherchez spécifiquement des lignes vierges dans une exportation, ce qui est une chose réelle, bien que rare, à vouloir.
Comment l'échelle de comparaison ?
L'approche naïve pour comparer deux listes est une boucle imbriquée : pour chaque élément de A, scannez tout B. That' ; s O (n×m), et it' ; est très bien pour cent éléments et inutilisable pour cinquante mille, où vous et #39 ; faites 2,5 milliards de comparaisons de chaînes.
La bonne approche indexe chaque liste dans une carte de hachage saisie par la touche de comparaison - la forme pliée et découpée de l'élément - la valeur étant l'original vu en premier. Construire chaque index est une passe linéaire Ensuite chaque question devient une recherche à temps constant par élément : cette clé est-elle dans B' ; s map ? Toute la comparaison est O (n+m), ce qui signifie que vingt mille éléments de chaque côté est quarante mille opérations de hachage et se termine plus rapidement que le navigateur ne peut repeindre.
Le même index donne gratuitement des doublons Comptez les occurrences par clé tout en la construisant ; toute clé avec un compte au-dessus de un est dupliquée dans cette liste Pas de deuxième passe, pas de structure supplémentaire.
En pratique le plafond est & #39 ; t la comparaison - it & #39 ; est le navigateur rendant un groupe de résultat avec cinquante mille lignes dans une zone de texte L'arithmétique se termine en millisecondes malgré tout Si vous & #39 ; sont régulièrement en train de réconcilier des listes aussi grandes, vous voulez probablement cela dans un script plutôt qu'un onglet, et l'algorithme ci-dessus est d'environ dix lignes dans n'importe quelle langue.
Le tri vaut une note Les résultats sont triés naturellement par défaut, ce qui signifie sensible au numérique : item2 avant item10, pas après. Un tri lexicographique simple met item10 d'abord parce que 1 < 2 caractère par caractère, ce qui est correct par la comparaison de la lettre de chaîne et faux par chaque attente humaine lors de l'analyse des ID ou des noms versionnés Désactivez le tri et vous obtenez l'ordre d'insertion - éléments dans la séquence dans laquelle ils sont apparus pour la première fois en A, puis B - ce qui est occasionnellement ce que vous voulez lorsque l'ordre original code quelque chose comme la récence.
À quoi cela ressemble-t-il en pratique ?
Quatre scénarios dans lesquels I' ; ont réellement utilisé cela, chacun étant mappé à un groupe de résultats différent.
Nettoyage d'une liste de diffusion avant un envoi. Collez la nouvelle liste et la liste précédemment envoyée. Seulement en A est qui a & #39 ; a été contacté - que & #39 ; est votre liste d'envoi. Dans les deux who' ; obtiendrait un double. Duplicats dans A est-ce que les quarante personnes de l'histoire en haut de cette page Cette vérification prend quinze secondes et c'est ça & #39 ; c'est celle qui aurait fait gagner une heure à l'ingénieur support.
Concilier deux systèmes. Exportez les e-mails des utilisateurs du CRM vers A et de la facturation vers B. Seulement en A est inscrit mais jamais facturé ; seulement en B est facturé mais manquant de CRM. Ce sont deux bugs différents Le premier pourrait être un webhook cassé, le second pourrait être une facture manuelle que quelqu'un a soulevée en dehors du flux Un seul " ; ces listes diffèrent" ; la réponse obscurcirait cela entièrement, ce qui est exactement pourquoi les deux directions sont rapportées séparément.
Dérive d’inventaire et de catalogue. Le mois dernier' ;s export SKU contre ce mois-ci' ;s. Seulement en A est interrompu, seulement en B est nouveau, dans les deux est reporté. Tri des affaires ici - les exportations proviennent de différents systèmes dans des ordres différents, et un diff rapporterait l'intégralité du fichier tel que modifié.
Contrôles de santé mentale du déploiement. Dossiers sur la mise en scène versus fichiers sur la production, à partir de deux ls sorties collées avec le séparateur d'espace. Seulement en A est ce qui a déjà été expédié et n°39 ;t.
Le modèle dans les quatre : la réponse utile n'est presque jamais " ; les listes sont différentes." ; C'est & #39 ;s qui articles, en qui direction - qui est précisément ce que les opérations définies vous donnent et quel score de similarité ou un résumé de différence ne' ;t.
Mes listes sont-elles téléchargées quelque part ?
Non, et réfléchissez une seconde à ce que vous et n°39 ; d coller dans un outil comme celui-ci.
It' ;s a abonné export. Une liste de courriels clients. ID des employés. Clés de licence. Numéros de compte. Les listes que les gens concilient sont, par leur nature, proches des données les plus sensibles qu'une organisation détient - vous ne conciliez pas les listes de rien, vous conciliez les listes de personnes. Et " ; permettez-moi de coller ces deux mille e-mails de clients dans un site Web aléatoire pour vérifier les chevauchements et les quotas ; est une phrase qui devrait vous empêcher d'être froid, car dans de nombreuses juridictions, c'est une relation de processeur que vous venez de créer sans contrat.
There' ;s aucune raison pour que ce calcul touche un réseau It' ;s cartes de hachage sur chaînes - quelques centaines de lignes de TypeScript sans dépendance L'outil sur Toolz.dev s'exécute entièrement dans votre onglet ; les listes sont des chaînes JavaScript dans votre navigateur' ; s mémoire et ils ne le quittent jamais Rien n'est téléchargé, enregistré ou stocké Vérifiez-le de la façon dont vous et n°39 ; d vérifier une telle affirmation : ouvrez l'onglet réseau et appuyez sur Comparer, ou désactivez votre wifi et regardez-le continuer à fonctionner. I' ; avez écrit davantage sur la raison pour laquelle cette architecture compte exactement pour cette classe de données dans Pourquoi les outils basés sur le navigateur battent-ils les serveurs côté serveur.
FAQ
Comment comparer deux listes pour trouver ce qu'elles ont en commun ?
Collez une liste dans la liste A, l'autre dans la liste B et appuyez sur Comparer Le & devis ; Dans les deux & devis ; le groupe est l'intersection - chaque élément présent dans les deux listes Vous pouvez copier ce groupe tout seul, le télécharger sous forme de fichier texte, ou exporter chaque groupe à la fois avec Copier le rapport Commandez n'a pas et n° 39 ; peu importe, donc les listes don&n° 39 ; pas besoin d'être triées de la même manière.
Comment trouver des éléments qui se trouvent dans une liste mais pas dans l'autre ?
Le " ; Seulement dans A" ; et " ; Uniquement dans B" ; les groupes répondent à cela, et ils' ; sont délibérément séparés Seulement dans A détient les éléments manquants dans la liste B ; Seulement dans B contient les éléments manquants dans la liste A. Ce sont généralement des problèmes différents avec des causes différentes - manquants-from-billing et manquants-from-CRM aren' ; t le même bug - donc les regrouper en une seule réponse perd les informations dont vous avez besoin Le " ; Unique" ; le groupe combine les deux si vous voulez la différence symétrique.
Peut-il trouver des doublons dans une seule liste ?
Oui. Les doublons en A et les doublons en B répertorient chaque élément distinct apparaissant plus d'une fois dans cette liste. Ceci est indépendant de la correspondance de listes croisées, donc un élément peut être à la fois dupliqué en A et présent en B. It' ; c'est généralement la vérification qui compte le plus dans la pratique, puisque les doublons dans la liste sont à l'origine des courriels en double et de la double facturation.
La capitalisation affecte-t-elle la comparaison ?
Seulement si vous le souhaitez. La correspondance sensible à la casse est désactivée par défaut, donc [email protected] et [email protected] sont traités comme un seul élément - et la sortie préserve la forme que vous avez collée plutôt que de mettre en minuscule vos données Allumez-le pour les valeurs où le cas a une signification : chemins Linux, chaînes de base64, hachages, clés API, Git SHA.
Quel' ; est la différence entre ceci et un outil de diffusion de texte ?
Un diff est positionnel : il compare la ligne 1 à la ligne 1 et calcule les modifications nécessaires pour transformer une séquence en une autre, donc réorganiser une liste fait changer presque toutes les lignes. Cet outil ignore entièrement l'ordre et demande seulement si un élément existe de chaque côté. Utiliser un diff pour le code et la prose où la position signifie ; utiliser la liste de comparaison pour rapprocher les exportations où l'ordre de tri est arbitraire.
Puis-je comparer des listes séparées par des virgules au lieu de nouvelles lignes ?
Oui - basculez le séparateur en virgule, point-virgule, espace ou onglet. L'espace autour de chaque élément est coupé par défaut, donc a, b, c se divise en trois éléments propres Une mise en garde : diviser sur les virgules isn' ; t analyse CSV réelle, donc si vos données ont cité des champs contenant des virgules, extrayez d'abord la colonne avec un outil CSV approprié.
Combien d'articles peut-il gérer ?
La comparaison indexe chaque liste dans une carte de hachage et s'exécute en temps linéaire plutôt que d'utiliser des boucles imbriquées, donc des dizaines de milliers d'éléments de chaque côté se terminent en millisecondes Le plafond pratique est que votre navigateur rende un très grand groupe de résultats dans la page, pas la comparaison elle-même.
Mes listes sont-elles téléchargées quelque part ?
Non. Toute analyse et comparaison se déroule sous forme de JavaScript dans votre navigateur - rien n'est transmis, enregistré ou stocké. Cela compte ici plus que pour la plupart des outils, car les listes que les gens concilient sont généralement des e-mails clients, des identifiants d'employés ou des clés de licence. Regardez votre onglet réseau lors de la comparaison ou hors ligne et cela continue de fonctionner.
Outils associés : Vérificateur de différentiel de texte Lorsque la commande et la position sont importantes, Diff JSON Pour des données structurées, Visionneuse CSV Pour extraire une colonne d'un vrai CSV, et compteur de mots Pour des comptes rapides. Lectures complémentaires : Pourquoi les outils basés sur le navigateur battent-ils les serveurs côté serveur et La boîte à outils du développeur Web.



