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.
| Cosa vedi nel diff | È una modifica reale? | Cosa fare |
|---|---|---|
| Righe in ordine diverso | No, se i dati sono lo stesso insieme | Ordinare entrambi i file per una colonna chiave |
| Delimitatore virgola vs. punto e virgola | No, stessi campi | Normalizzare a un unico delimitatore |
Ada vs. "Ada" | No, le virgolette qui sono opzionali | Normalizzare le virgolette |
| Fine riga CRLF vs. LF | No | Normalizzare le fine riga |
| Una riga vuota finale | No | Rimuoverla |
| Il valore di una cella è cambiato | Sì | Indagare, 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.
| Metodo | Ideale per | Sforzo | Capisce il CSV? |
|---|---|---|---|
| Guardare a occhio | File minuscoli, poche righe | Basso | No, il parser sei tu |
| Strumento di diff online | Verifiche rapide, incollare da ovunque | Basso | Riga per riga, sì |
| App per fogli di calcolo | Revisione visiva, formule, filtraggio | Medio | Sì, ma manuale |
Riga di comando (sort, csvkit) | File grandi, scripting, confronti per chiave | Medio | Sì, 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.
- Assicurati che entrambi i file usino lo stesso delimitatore e abbiano la stessa riga di intestazione.
- Se l'ordine delle righe non conta, ordina prima entrambi i file per una colonna chiave.
- Apri lo strumento di confronto CSV.
- Incolla l'originale a sinistra e la nuova versione a destra.
- 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:
| Riga (per id) | Colonna | Prima | Dopo | Modifica |
|---|---|---|---|---|
| 7 | role | editor | admin | Modificato |
| 7 | seats | 3 | 5 | Modificato |
| 8 | — | — | — | Nessuna 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
| Trappola | Perché morde | Soluzione |
|---|---|---|
| Delimitatori non corrispondenti | Virgola vs. punto e virgola fa sembrare diverso ogni campo | Normalizzare prima a un unico delimitatore |
| BOM all'inizio | Un marcatore di ordine dei byte nascosto altera la prima cella dell'intestazione | Rimuovere il BOM prima di confrontare |
| ID con zeri iniziali | Un foglio di calcolo può aver trasformato 007 in 7 | Mantenere le colonne ID come testo; confrontare come stringhe |
| A capo incorporati | Un campo tra virgolette può contenere un'interruzione di riga, spostando ogni riga successiva | Usare un vero parser CSV, non una divisione per righe |
| Spazi finali nelle celle | Spazi invisibili appaiono come una modifica | Tagliare 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.