In breve: le righe "duplicate" non sono sempre byte identici — spazi finali, maiuscole diverse o normalizzazione Unicode diversa possono nascondere duplicati esatti o crearne di falsi. Capire come funziona il confronto rende la pulizia accurata invece di cancellare per errore righe che ti servivano. Abbina questa guida a Remove Duplicate Lines, Text Difference, Word Frequency e Remove Extra Spaces.

Duplicate Finder su CharCount rimuove righe ripetute da liste, log, export CSV e liste di parole chiave. La parte complicata non è la rimozione — è decidere cosa conta come "la stessa riga" prima di rimuovere qualcosa.

Approfondimenti: il riferimento MDN su JavaScript Set spiega la struttura dati che la maggior parte degli strumenti di deduplicazione usa internamente, la guida MDN su String.normalize() copre la normalizzazione Unicode, e il report Unicode sulla segmentazione del testo (UAX #29) definisce come il testo viene diviso in unità significative.

Come funziona davvero il rilevamento dei duplicati

Sotto il cofano, uno strumento per righe duplicate scorre ogni riga e controlla se è già stata vista — di solito usando un Set, che memorizza valori unici e rifiuta i duplicati esatti in tempo costante. Questo è veloce, ma "esatto" fa molto lavoro in quella frase: un Set confronta le stringhe byte per byte, quindi "Mela" e "mela" sono voci diverse, così come "testo " e "testo" (spazio finale).

Ecco perché una deduplicazione ingenua su un export CSV o una lista di parole chiave raschiata spesso "fallisce" — non è rotta, sta confrontando esattamente quello che le hai dato, inclusi spazi invisibili e differenze di maiuscole che non avevi notato.

Preservare l'ordine vs ordinare e deduplicare

Ci sono due strategie comuni. La deduplicazione che preserva l'ordine mantiene la prima occorrenza di ogni riga e la sua posizione originale — la scelta giusta per log, chat esportate o qualsiasi cosa dove la sequenza ha significato. Ordinare e deduplicare (come la classica pipeline Unix sort | uniq) riordina tutto alfabeticamente prima, il che è più veloce su file enormi ma distrugge l'ordine originale — va bene per una lista di parole chiave, sbagliato per un changelog.

Scegli la deduplicazione che preserva l'ordine ogni volta che "cosa è venuto prima" conta; scegli ordina-e-deduplica solo quando l'ordine della lista era arbitrario in partenza.

Dove la normalizzazione cambia il conteggio

Unicode permette allo stesso carattere visibile di esistere come sequenze di byte diverse — una "é" accentata può essere un unico punto di codice composto (NFC) oppure una "e" più un segno diacritico separato (NFD). Due righe che sembrano identiche a schermo possono fallire una deduplicazione a corrispondenza esatta se una proviene da un export Mac e l'altra da uno Windows, perché sono in forme di normalizzazione diverse.

String.normalize('NFC') riduce entrambe le forme alla stessa rappresentazione prima del confronto, ed è per questo che un buon strumento per duplicati normalizza il testo prima — altrimenti sottoconta silenziosamente i duplicati che sono identici visivamente, ma non byte per byte.

Un flusso di pulizia più sicuro

  • Decidi prima: l'ordine delle righe conta per questa lista? Questo determina la strategia.
  • Rimuovi gli spazi finali e normalizza le maiuscole solo se la lista è pensata per essere case-insensitive (una lista di parole chiave spesso lo è; una lista di password mai).
  • Esegui la deduplicazione, poi controlla a campione le righe rimosse per confermare che fossero davvero duplicati.
  • Conserva il file originale finché non hai verificato la versione pulita.

Per qualsiasi caso ambiguo, passa il prima/dopo attraverso Text Difference per vedere esattamente cosa è stato rimosso, e Word Frequency per verificare che nessun termine ripetuto legittimo sia stato trattato come rumore.