Trouver les doublons d'une liste sans tableur
Publié le 07/08/2026 · 12 min de lecture · Outils texte & langage
Daniel Okonkwo — Développeur front-end et rédacteur Tech chez OneKitly
Performance web · Formats de fichiers
Vérifié à partir de 4 sources
duplicate-line-finder compare des lignes entières, octet par octet. Par défaut la comparaison respecte la casse — Paris, paris et PARIS passés ensemble n'ont donné aucun doublon ; en activant « Ignorer la casse » il en signale un, affiché « Paris », l'orthographe de la première occurrence. Il ne rogne pas : « Paris » au-dessus de « Paris » suivi d'une espace revient sans aucun doublon, dans les deux modes de casse. C'est la surprise la plus fréquente, et il vaut la peine de savoir que l'outil frère remove-duplicate-lines, lui, rogne par défaut, et supprime bel et bien l'une des deux lignes sur cette même entrée. Aucun des deux n'a tort ; ils répondent simplement à des questions différentes, et ils coexistent sur le site. Il n'applique pas non plus de normalisation Unicode : un mot dont l'accent tient en un seul point de code et le même mot dont l'accent est une lettre suivie d'un signe combinant sont deux lignes différentes, alors qu'ils s'affichent à l'identique — ce qui touche particulièrement les listes françaises, espagnoles et portugaises. La sortie n'est pas une liste dédoublonnée. C'est l'ensemble des valeurs qui apparaissent plus d'une fois, affichées une fois chacune, dans l'ordre de leur première apparition, avec le texte exact de cette première occurrence. Si rien ne se répète tu obtiens un court message plutôt qu'une zone vide. Les lignes vides sont comptées comme les autres, avec une bizarrerie : si la seule valeur répétée de ta liste est la ligne vide, l'outil annonce qu'il n'y a pas de doublon, car sa sortie serait une chaîne vide et la chaîne vide déclenche ce même message.
Deux lignes qui paraissent identiques ne le sont souvent pas. La casse, une espace finale, une espace insécable et deux encodages différents de la même lettre accentuée ont été passés dans le détecteur de doublons : il n'en a signalé aucun dans trois cas sur quatre.
Ce que l'outil renvoie réellement
Il compte chaque ligne, garde celles dont le compte dépasse un, et affiche chacune d'elles une fois. Sur l'entrée b, a, b, a, c il a rendu b puis a — dans cet ordre parce que b apparaît en premier, et non parce que b se répète davantage. Rien n'est trié, rien n'est retiré de ta liste, et le nombre de répétitions de chaque valeur n'est pas indiqué. Si tu veux la liste débarrassée des répétitions, c'est un autre outil, remove-duplicate-lines, et il conserve la première occurrence de chaque valeur à sa position d'origine.
Le texte affiché est la première occurrence, mot pour mot. Cela ressemble à un détail jusqu'à ce que tu actives « Ignorer la casse » : sur Apple, banana, APPLE il affiche Apple, ni APPLE ni apple. Il a décidé que les deux sont la même valeur, il doit t'en montrer une, il montre celle qu'il a rencontrée en premier. Si ta liste mélange les graphies criées et normales, la sortie t'indique donc quelle graphie est arrivée en premier, pas laquelle est la plus fréquente ni laquelle est correcte.
L'espace finale, et l'outil frère qui n'est pas d'accord
« Paris » au-dessus de « Paris » suivi d'une espace n'a produit aucun doublon, et « Paris » au-dessus de « Paris » précédé d'une espace non plus. Les deux lignes diffèrent d'un caractère, ce caractère est invisible, et l'outil n'a aucune option de rognage à activer. Pendant ce temps, remove-duplicate-lines porte une bascule « Rogner les lignes » active dès l'ouverture : les deux mêmes lignes entrent et une seule ressort. Deux outils de la même catégorie, à une page d'écart, donnant des réponses opposées sur la même entrée. Les deux se défendent : un détecteur de doublons qui rognerait mentirait sur le contenu de ton fichier, et un suppresseur qui ne rognerait pas te laisserait une liste qui a toujours l'air pleine de doublons.
La conséquence pratique est un ordre d'opérations. Passe d'abord trim-lines sur la liste, puis le détecteur. Sur une entrée volontairement bancale — deux espaces, alpha, deux espaces, puis une ligne de tabulation seule, puis deux espaces, beta, une espace, puis une ligne vide, puis alpha — le détecteur n'a signalé aucun doublon sur le texte brut, et a signalé alpha sur le même texte après passage de trim-lines et remove-blank-lines. Rien dans la liste n'a changé d'une manière qu'un lecteur remarquerait. Ce qui a changé, c'est la capacité de l'outil à voir ce que le lecteur voyait.
Deux écritures du même mot accentué
Unicode peut écrire une lettre accentuée de deux façons. Soit en un point de code qui porte déjà l'accent, soit en la lettre nue suivie d'un signe combinant distinct. Les deux s'affichent en un même glyphe, les deux sont corrects, et lequel tu obtiens dépend de la provenance du texte : certains systèmes d'exploitation et certaines chaînes de saisie produisent la forme décomposée par défaut. L'annexe standard Unicode n° 15 définit les formes de normalisation qui font correspondre l'une à l'autre, et JavaScript les expose par une méthode de chaîne. duplicate-line-finder ne l'appelle pas.
Une liste contenant le mot « café » écrit une fois de chaque façon est donc revenue sans aucun doublon. Les deux lignes sont visuellement indiscernables et longues de quatre points de code contre cinq. Puis la bizarrerie : ajoute une troisième copie dans la première écriture et l'outil signale soudain un doublon, parce que deux des trois coïncident désormais exactement. Voilà la forme d'échec à surveiller. Ce n'est pas que l'outil ne trouve jamais de doublons accentués ; c'est qu'il en trouve certains, ce qui rend les manques bien plus difficiles à remarquer. Si ta liste est française, espagnole, portugaise, allemande ou italienne et que les comptes semblent un peu bas, c'est la première chose à tester — et la façon de tester est de trier la liste d'abord : les deux écritures se retrouveront côte à côte et se trahiront en refusant d'avoir l'air différentes.
« Ignorer la casse » n'est pas « replier la langue »
La bascule met les deux côtés en minuscules avec la correspondance indépendante de la langue que fournit JavaScript. Cela couvre les cas ordinaires dans nos six langues, et cela couvre correctement les lettres accentuées : les formes majuscule et minuscule d'une voyelle accentuée se replient l'une sur l'autre. Cela ne fait rien de plus qu'une langue particulière souhaiterait. La forme majuscule allemande écrite en deux lettres et l'eszett ne se replient pas ensemble, ce qui a été vérifié : une liste de deux lignes contenant l'écriture majuscule et l'écriture minuscule d'un mot allemand courant est revenue sans doublon, parce que la mise en minuscules de la forme criée donne deux lettres là où l'autre ligne en a une.
Le point général est que « Ignorer la casse » répond à une question typographique, pas linguistique. Deux lignes qu'un lecteur français appellerait la même entrée — l'une avec l'accent saisi, l'autre sans — ne sont pas des doublons ici et ne le seront jamais, parce que retirer les accents est une autre opération avec un autre outil. Si c'est cette comparaison qu'il te faut, retire d'abord les accents d'une copie de la liste, passe le détecteur sur la copie, et sers-toi de sa sortie comme d'une liste de points à vérifier dans l'original.
Une routine qui tient
Nettoyer, puis chercher, puis décider, puis supprimer. trim-lines et remove-blank-lines mettent chaque ligne dans une forme comparable. duplicate-line-finder t'indique quelles valeurs se répètent, sans rien toucher. Tu regardes cette courte liste et tu décides si chaque répétition est une vraie double saisie ou deux choses différentes qui partagent un nom — l'outil ne peut pas le savoir, et c'est l'étape que les gens sautent. Alors seulement remove-duplicate-lines passe sur l'original. Procéder dans cet ordre signifie que tu ne supprimes jamais une ligne que tu n'as pas regardée, ce qui compte quand la liste est faite de références clients et non de données de test.
Un dernier détail issu des essais. Les deux outils découpent sur un saut de ligne précédé d'un retour chariot facultatif : une liste enregistrée sous Windows et la même liste enregistrée sur Mac donnent des résultats identiques — un fichier CRLF contenant deux fois la lettre a a signalé un doublon, exactement comme la version simple. Et un saut de ligne final à la fin de ta liste crée une ultime ligne vide, qui est comptée mais, seule, n'est jamais affichée.
| Entrée | Ce qu'il a signalé | Pourquoi |
|---|---|---|
| Paris, paris, PARIS — réglages par défaut | Aucun doublon | « Ignorer la casse » est désactivé par défaut ; les trois lignes diffèrent |
| Les trois mêmes lignes avec « Ignorer la casse » | Paris — affiché avec l'orthographe de la première occurrence | Les deux côtés sont mis en minuscules pour la comparaison, mais le texte d'origine est conservé pour l'affichage |
| Paris, puis Paris suivi d'une espace | Aucun doublon, dans les deux modes de casse | L'outil ne rogne jamais et n'a pas d'option de rognage |
| Les deux mêmes lignes dans remove-duplicate-lines | Une seule ligne ressort | Cet outil a une bascule « Rogner les lignes » activée par défaut |
| New York avec une espace ordinaire, puis New York avec U+00A0 | Aucun doublon | Points de code différents ; la comparaison porte sur les caractères exacts |
| Le mot café deux fois, écrit avec les deux formes Unicode | Aucun doublon | Aucune normalisation n'est appliquée ; une ligne fait quatre points de code, l'autre cinq |
| Le même, plus une troisième copie dans la première forme | café — un doublon est signalé | Deux des trois coïncident désormais exactement, le compte atteint donc deux |
| Une liste dont la seule valeur répétée est la ligne vide | Aucun doublon | La sortie serait une chaîne vide, et une sortie vide déclenche ce même message |
Questions fréquentes
- Le détecteur dit qu'il n'y a pas de doublon mais je vois deux lignes identiques. Que se passe-t-il ?
- Trois candidats, par ordre de probabilité. Une espace en début ou en fin sur l'une des deux, que l'outil ne rogne pas. Une espace insécable au lieu d'une ordinaire quelque part à l'intérieur, ce qui arrive sans cesse dans du texte collé depuis des documents. Ou deux écritures Unicode différentes de la même lettre accentuée. Teste-les dans cet ordre : passe trim-lines sur la liste et réessaie, ce qui règle le premier candidat en quelques secondes. S'il ne trouve toujours rien et que les lignes contiennent des accents, c'est le troisième candidat, et trier la liste placera les deux écritures côte à côte pour que tu puisses les comparer.
- Pourquoi y a-t-il à la fois un détecteur et un suppresseur de doublons ?
- Parce que les deux répondent à des questions différentes et ont des réglages par défaut différents. Le détecteur signale ce qui se répète et ne change rien, pour que tu regardes avant de couper ; il ne rogne pas, ce qui en fait un compte rendu fidèle de ce qui est littéralement dans le fichier. Le suppresseur produit une liste nettoyée et rogne par défaut, ce qui le rend tolérant aux résidus invisibles qu'un collage traîne avec lui. Sur une liste de deux lignes ne différant que par une espace finale, le détecteur dit qu'il n'y a rien à signaler et le suppresseur en efface une. Ce n'est un bogue chez aucun des deux ; c'est la raison de passer le détecteur en premier quand la liste compte.
- M'indique-t-il combien de fois chaque valeur se répète ?
- Non. Il compte en interne, se sert du compte pour décider si une valeur mérite d'être affichée, puis n'affiche que la valeur. Sur b, a, b, a, c il a rendu b et a sans aucun chiffre, et il n'existe pas d'option pour les montrer. Si tu as besoin des comptes, la voie pratique est de trier la liste et de lire les séries, ou d'utiliser un compteur de mots ou d'occurrences sur les valeurs dont tu sais déjà qu'elles se répètent. Le rôle du détecteur est de te donner une courte liste de suspects, et il s'y tient délibérément.
- Traitera-t-il une adresse e-mail écrite dans deux casses différentes comme une seule adresse ?
- Seulement si tu actives « Ignorer la casse », et tu devrais : la moitié « domaine » d'une adresse est insensible à la casse par spécification, donc la même boîte écrite de deux façons est réellement une seule adresse. Bascule désactivée, l'outil ne signale rien sur une liste de deux lignes contenant l'écriture mixte et l'écriture en minuscules de la même adresse, ce qui a été vérifié directement. Cela vaut la peine d'être su avant de dédoublonner un export de contacts, car une liste qui paraît propre à 1 200 lignes peut en contenir deux douzaines, et chacune est une personne qui reçoit l'envoi deux fois.
- Puis-je l'utiliser sur une liste de milliers de lignes ?
- Oui. Le travail tient en une passe pour compter et une passe pour collecter, avec une table de hachage indexée sur la ligne : le temps croît à peu près au rythme du nombre de lignes, et non de son carré — une comparaison naïve de chaque ligne avec toutes les autres ne survivrait pas à quelques milliers de lignes, et ce n'est pas ce qui se passe ici. Tout s'exécute dans la page, sur ta machine, sans envoi, donc le plafond pratique est la mémoire de ton navigateur et non une limite serveur. Ce qui te ralentira, ce n'est pas l'outil : c'est la lecture de la sortie et la décision sur le sens de chaque répétition.
Articles qui pourraient t'intéresser
Tous les guides →Outils similaires
Tout ce qui suit décrit ce que font ces outils aujourd'hui, vérifié en exécutant leurs propres transformations sur les entrées exactes reproduites dans chaque article, et non ce qu'une norme imposerait à un outil de texte. Le traitement du texte ligne à ligne n'a aucune autorité unique : ce qui compte comme espace, le fait que deux lignes accentuées soient ou non la même ligne, et l'endroit où se termine une URL dans une phrase sont tranchés différemment par chaque programme dans lequel tu colleras du texte. Quand un outil se trompe sur un cas, c'est dit franchement plutôt que contourné. Avant de passer tout cela sur une liste que tu ne pourras pas réexporter, passe sur une copie et compare le nombre de lignes aux deux bouts.
Sources
Tu as repéré une erreur dans cet article ?