Confrontare due file CSV e trovare le differenze

Il modo più rapido per confrontare due file CSV è incollarli entrambi in uno strumento di diff affiancato, allineare le colonne e leggere le righe che evidenzia. Il confronto è la parte facile. È il rumore a mettere in difficoltà le persone: un'esportazione riordinata, un punto e virgola al posto di una virgola o un valore che qualcuno ha messo tra virgolette possono far sembrare due file che contengono gli stessi dati come se non avessero nulla in comune.

Questa guida spiega come ottenere un diff CSV pulito e affidabile. Vedremo perché due esportazioni equivalenti divergono sulla carta, quali metodi vale la pena conoscere e un esempio pratico che puoi seguire. Se vuoi solo lo strumento, la nostra pagina di confronto CSV fa tutto nel browser.

Perché i file CSV sono ingannevolmente difficili da confrontare

Il CSV sembra semplice, ma non ha un unico standard rigoroso. La cosa più vicina è RFC 4180, e molti file reali non lo rispettano. Due esportazioni della stessa tabella possono differire per delimitatore, virgolette, fine riga e ordine delle righe pur descrivendo esattamente gli stessi dati. Un diff di testo semplice non lo sa, quindi segnala tutto.

Ecco la cosa fondamentale da decidere prima di iniziare: l'ordine delle righe è importante per te? Un'esportazione di database ordinata per nome e la stessa esportazione ordinata per ID contengono l'identico insieme di record, ma un diff di righe colora di rosso e verde quasi ogni riga. Se le righe hanno una chiave stabile (una colonna ID), ordinare prima entrambi i file per quella chiave rende il diff di nuovo leggibile.

Sembra una modifica, di solito non lo è
Cosa vedi nel diffÈ una modifica reale?Cosa fare
Righe in ordine diversoNo, se i dati sono lo stesso insiemeOrdinare entrambi i file per una colonna chiave
Delimitatore virgola vs. punto e virgolaNo, stessi campiNormalizzare a un unico delimitatore
Ada vs. "Ada"No, le virgolette qui sono opzionaliNormalizzare le virgolette
Fine riga CRLF vs. LFNoNormalizzare le fine riga
Una riga vuota finaleNoRimuoverla
Il valore di una cella è cambiatoIndagare, questa è reale

La riga del delimitatore frega molte persone, soprattutto tra regioni: molte impostazioni locali europee usano il punto e virgola perché la virgola è il separatore decimale. Stessi dati, separatore diverso. Se vuoi il dettaglio su come browser e strumenti leggono il testo tabellare, la nota di MDN sulla lettura dei file nel browser è un buon punto di partenza.

Quattro modi per confrontare il CSV e quando usare ciascuno

Non esiste un unico metodo migliore. Dipende dalla dimensione dei file e dal fatto che l'ordine delle righe conti. Ecco come si confrontano le opzioni comuni.

MetodoIdeale perSforzoCapisce il CSV?
Guardare a occhioFile minuscoli, poche righeBassoNo, il parser sei tu
Strumento di diff onlineVerifiche rapide, incollare da ovunqueBassoRiga per riga, sì
App per fogli di calcoloRevisione visiva, formule, filtraggioMedioSì, ma manuale
Riga di comando (sort, csvkit)File grandi, scripting, confronti per chiaveMedioSì, quando ordini prima

Per la maggior parte delle persone uno strumento da browser vince in velocità: niente da installare, e puoi incollare un'esportazione direttamente da un download o da un client di database. Il problema è il rumore di ordine delle righe e delimitatore, di cui ci occupiamo subito. Per file molto grandi, vale la pena imparare csvkit da riga di comando.

Il confronto pulito più rapido, passo dopo passo

Questa è la routine che uso quando qualcuno mi passa due esportazioni e mi chiede "cosa è cambiato?". Richiede meno di un minuto.

  1. Assicurati che entrambi i file usino lo stesso delimitatore e abbiano la stessa riga di intestazione.
  2. Se l'ordine delle righe non conta, ordina prima entrambi i file per una colonna chiave.
  3. Apri lo strumento di confronto CSV.
  4. Incolla l'originale a sinistra e la nuova versione a destra.
  5. Leggi il risultato. Il verde è una riga aggiunta, il rosso una riga rimossa, e una cella modificata appare come una di ciascuna.

Il passo due è tutto il trucco quando le righe non sono ordinate. Una volta che entrambi i file sono ordinati allo stesso modo, l'unica cosa da evidenziare sono le righe che sono davvero cambiate. Il nostro motore di diff è costruito sul diff-match-patch di Google, che confronta prima riga per riga, restando quindi veloce anche su file lunghi.

Un esempio pratico

Supponiamo che tu stia revisionando una modifica a una tabella di utenti. Ecco il prima:

id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1

Ed ecco il dopo, esportato in un ordine di righe diverso:

id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5

Metti questi in un diff di righe grezzo ed entrambe le righe di dati sembrano cambiate, perché si sono scambiate di posizione. Ordina entrambe per la colonna id, e la storia vera è breve:

Cosa è cambiato davvero
Riga (per id)ColonnaPrimaDopoModifica
7roleeditoradminModificato
7seats35Modificato
8Nessuna modifica (solo spostata)

Una modifica reale: il ruolo e il numero di posti di Ada sono cambiati. La riga di Alan si è solo spostata. Quella promozione da editor a admin è esattamente il tipo di cosa che vuoi cogliere in revisione, ed è facile da perdere quando è sepolta sotto righe che il diff ha erroneamente segnalato come cambiate.

Eliminare il rumore dell'ordine delle righe da riga di comando

Se i tuoi file sono già su disco e le righe non hanno un ordine intrinseco, la stessa idea di "ordinare prima" funziona con due comandi brevi. Mantieni l'intestazione al suo posto e ordina il resto:

(head -1 old.csv; tail -n +2 old.csv | sort) > old.sorted.csv
(head -1 new.csv; tail -n +2 new.csv | sort) > new.sorted.csv
diff old.sorted.csv new.sorted.csv

Ora diff riporta solo le righe che sono davvero cambiate, perché entrambi i file sono nello stesso ordine. Per confronti per chiave che ignorano anche l'ordine delle colonne, csvsort e csvjoin di csvkit danno più controllo. È l'equivalente da terminale di ordinare entrambi i lati prima di confrontare nel browser.

Delimitatori, virgolette e la realtà disordinata

I file CSV reali infrangono le regole di continuo. Un campo che contiene una virgola deve essere tra virgolette, quindi "Lovelace, Ada" è un campo, non due. Le virgolette all'interno di un campo tra virgolette vengono raddoppiate: "Ha detto ""ciao""". E il separatore stesso varia: i fogli di calcolo in impostazioni locali con virgola decimale esportano con punti e virgola, e i file separati da tabulazione (TSV) sono comuni nelle pipeline di dati. Prima di confrontare, assicurati che entrambi i file usino lo stesso delimitatore e la stessa convenzione di virgolette, oppure normalizzali con un parser che segue RFC 4180. Altrimenti il diff confronta due dialetti diversi, non due versioni degli stessi dati.

Trappole comuni da tenere d'occhio

TrappolaPerché mordeSoluzione
Delimitatori non corrispondentiVirgola vs. punto e virgola fa sembrare diverso ogni campoNormalizzare prima a un unico delimitatore
BOM all'inizioUn marcatore di ordine dei byte nascosto altera la prima cella dell'intestazioneRimuovere il BOM prima di confrontare
ID con zeri inizialiUn foglio di calcolo può aver trasformato 007 in 7Mantenere le colonne ID come testo; confrontare come stringhe
A capo incorporatiUn campo tra virgolette può contenere un'interruzione di riga, spostando ogni riga successivaUsare un vero parser CSV, non una divisione per righe
Spazi finali nelle celleSpazi invisibili appaiono come una modificaTagliare i valori delle celle prima di confrontare

Quando un foglio di calcolo è lo strumento migliore

Un diff di testo è perfetto per individuare quali righe sono cambiate e rivedere la modifica come dati. Ma se devi filtrare, creare tabelle pivot o confrontare per formula su migliaia di righe, un foglio di calcolo è più adatto: importa entrambi i file, allineali per chiave e usa una ricerca per segnalare le discrepanze. I due approcci si completano. Usa il diff per una lettura visiva rapida e il foglio di calcolo quando devi sezionare i dati. Per le regole del formato sottostante in ogni caso, la panoramica del CSV di Wikipedia è un solido riferimento.

Strumenti correlati

Il CSV raramente è l'unico formato che gestisci. Se gli stessi dati esistono anche come JSON, il confronto JSON applica la stessa idea. Eliminare i duplicati da una colonna di valori è rapido con rimuovi righe duplicate, e mettere le righe in un ordine prevedibile prima di un diff è esattamente lo scopo di ordina righe.

Domande frequenti

Confrontare file CSV online li carica da qualche parte?
Su comparetext.org il diff viene eseguito nel browser. I due file CSV vengono confrontati da JavaScript sulla tua macchina, quindi nulla viene inviato a un server a meno che tu non faccia clic esplicitamente su Salva o Condividi. Questo lo rende sicuro per esportazioni di clienti, dati finanziari e altri fogli di calcolo che non vorresti incollare in un sito che carica a ogni battitura.
Perché i miei due file CSV mostrano ogni riga come diversa?
Quasi sempre è l'ordine delle righe o il delimitatore, non modifiche reali. Un'esportazione è ordinata diversamente dall'altra, oppure una usa le virgole e l'altra i punti e virgola, oppure le fine riga differiscono. Assicurati che entrambi i file usino lo stesso delimitatore, poi ordina entrambi per una colonna chiave così l'ordine smette di contare. Dopodiché il diff di solito si riduce alla manciata di righe e celle che sono davvero cambiate.
Come confronto due file CSV ignorando l'ordine delle righe?
Ordina entrambi i file per una colonna chiave stabile prima di confrontare. Se le righe hanno un ID, ordina per quello; altrimenti ordina l'intera riga. Mantieni la riga di intestazione al suo posto e ordina solo le righe di dati. Nel browser puoi incollare le versioni ordinate; da riga di comando, ordina il file dopo l'intestazione. Una volta che entrambi i file sono nello stesso ordine, nel diff compaiono solo le righe che sono davvero cambiate invece di ogni riga che si è semplicemente spostata.
Perché il mio CSV usa i punti e virgola invece delle virgole?
Molte impostazioni locali europee usano la virgola come separatore decimale, quindi le app per fogli di calcolo esportano il CSV con un delimitatore punto e virgola per evitare ambiguità. I dati sono gli stessi; cambia solo il separatore. Prima di confrontare due file, assicurati che usino lo stesso delimitatore, altrimenti vedrai ogni campo segnalato come cambiato. Normalizzare entrambi a virgole (o entrambi a punti e virgola) con uno strumento che capisce il CSV risolve. I file separati da tabulazione hanno lo stesso problema con un separatore diverso.
Come confronto file CSV con ordini di colonne diversi?
Un diff di testo semplice confronta le righe da sinistra a destra, quindi le colonne riordinate sembrano una modifica totale anche quando i dati corrispondono. Per gestirlo, riordina prima le colonne in modo che corrispondano in entrambi i file, oppure usa uno strumento che capisce il CSV e confronta per nome dell'intestazione anziché per posizione. Strumenti da riga di comando come csvkit possono selezionare e riordinare le colonne per nome. Una volta che le colonne sono allineate nello stesso ordine, un normale diff riga per riga torna a funzionare.
Posso confrontare file CSV grandi senza che la pagina si blocchi?
Sì, fino a un certo punto. Un diff in modalità riga resta veloce su file con migliaia di righe perché confronta prima righe intere invece di ogni carattere. I file molto grandi (decine di megabyte o milioni di righe) si gestiscono meglio con uno strumento da riga di comando come csvkit o un'importazione in database, che trasmettono i dati. Per un'esportazione che puoi scorrere comodamente in un browser, un diff online è l'opzione più rapida.

Pronto a provarlo? Incolla i tuoi file nello strumento di confronto CSV e vedi cosa è cambiato.