Diff CSV: confronta due file CSV online
Incolla o carica due file CSV e vedi affiancate le righe, i prezzi e i campi cambiati. Funziona nel browser, senza registrazione, senza upload.
Cos'è lo strumento di diff CSV?
Uno strumento gratuito, nel browser, per confrontare due file CSV. Incolla l'export del fornitore di ieri a sinistra, quello di oggi a destra, e le celle cambiate si accendono. Niente lascia la tua macchina. Nessun account, nessun upload, nessuna quota.
Il diff vero e proprio è a livello di carattere, con un passaggio di post-elaborazione semantico che riporta gli evidenziatori sull'intero valore del campo invece di sparpagliarli tra le virgole. La grammatica che questo strumento assume è la specifica CSV de facto, RFC 4180: campi separati da virgola, doppie virgolette opzionali, virgolette raddoppiate per fare l'escape di una virgoletta letterale, fine riga CRLF.
Se hai mai aperto in Excel due listini fornitore da 8.000 righe, scorso colonna per colonna cercando lo SKU il cui prezzo si è mosso e mollato, questo è lo strumento che ti porta al cambiamento in pochi secondi. Per prosa libera usa il nostro strumento di diff testuale. Per dati strutturati con chiavi stabili, il diff JSON gestisce il riordino degli oggetti molto meglio di quanto possa fare il CSV. Il diff XML è la scelta giusta per export di dati legacy da ERP più vecchi.
Come funziona davvero il diff
Il confronto è riga per riga, consapevole dei caratteri. Le inserzioni appaiono in verde a destra, le eliminazioni in rosso a sinistra. Il passaggio in modalità riga mantiene prestazioni ragionevoli su file da 5 MB, poi un raffinamento in modalità carattere sulle righe cambiate fa emergere il campo esatto che si è mosso. Per la maggior parte degli export di foglio di calcolo è più rapido e pulito che lanciare diff in un terminale.
Siamo onesti su ciò che non è. È un diff testuale, non un confronto realmente consapevole delle chiavi di riga. Se riordini le righe ordinando su un'altra colonna, ogni riga sembrerà cambiata anche se i dati sottostanti sono identici. Se riordini le colonne, succede la stessa cosa. Qui non c'è la nozione di chiave primaria, come la danno csvjoin di csvkit o un merge di pandas su uno SKU. Ordina entrambi i file allo stesso modo prima di incollare, oppure usa uno di quegli strumenti quando ti serve davvero un confronto basato sugli insiemi.
La riga di intestazione per questo strumento è dato. La riga 1 è trattata come ogni altra, il che significa che un rinominato di header appare come un diff di una sola riga in cima. Di solito è quello che vuoi quando rivedi la deriva di schema. Se ti interessano solo le righe del corpo, togli l'header da entrambi i lati prima di incollare. Il formato CSV in sé, comprese le convenzioni sull'header, è descritto nell'articolo di sfondo sul CSV e in RFC 7111, che definisce frammenti URI per selezionare intervalli di celle dentro una risorsa CSV.
Come confrontare file CSV in tre passi
Due pannelli di testo, un diff. Niente registrazione, niente upload, nessuna andata e ritorno al server.
- 1
Incolla o carica il tuo CSV
Incolla il CSV più vecchio a sinistra e quello più nuovo a destra. Oppure clicca Carica su uno dei due lati per caricare un file .csv, .tsv o .txt direttamente dal disco. Il pulsante Esempio riempie entrambi i pannelli con un piccolo listino prodotti, così vedi prima lo strumento all'opera.
- 2
Normalizza i fine riga se serve
Excel salva CSV con CRLF (\r\n) su Windows; strumenti come csv.writer di Python o una pipeline di shell Unix scrivono spesso LF (\n). Se un lato è CRLF e l'altro LF, ogni riga sembrerà cambiata. Apri entrambi nello stesso editor (o passa per dos2unix) prima di incollare, così i fine riga combaciano. Il BOM UTF-8 a inizio di un CSV salvato da Excel è l'altro classico colpevole; rimuovilo se l'altro file non ce l'ha.
- 3
Leggi il diff
Le eliminazioni appaiono evidenziate in rosso a sinistra, le inserzioni in verde a destra. Scorri uno dei due lati e l'altro segue. Cerca prezzi cambiati, nuove righe aggiunte in fondo, indirizzi email corretti a metà lista. Le modifiche di header appaiono come diff di una riga sulla riga 1.
Quando il diff CSV è lo strumento giusto
Riconciliare un CSV di inventario fornitore con il tuo ultimo export
Un fornitore manda un listino fresco ogni settimana. Butta il file della scorsa settimana nel pannello sinistro, quello di questa settimana a destra, e i movimenti di prezzo a livello di SKU saltano fuori senza dover scorrere 4.000 righe in Excel a caccia di quale cella è diventata gialla. Farlo in Excel con VLOOKUP contro un secondo foglio è fattibile ma lento; il diff è più veloce quando ti serve solo un controllo rapido prima di spingere i nuovi prezzi nello store.
Confrontare un export di database con una copia partner sanificata
Prima di mandare un dump clienti a un partner mascheri le PII: l'email diventa [email protected], il telefono viene mascherato, i nomi completi tagliati all'iniziale. Diff dell'export sorgente contro la copia sanificata e conferma che solo le colonne mascherate sono cambiate. Se nel diff appare inaspettatamente una colonna billing_address, il tuo script di mascheramento ha saltato un campo, e lo prendi prima che il file lasci il portatile.
Auditare un product feed prima di pubblicarlo su un catalogo merchant
Google Merchant Center, Facebook Catalog e la maggior parte dei marketplace mangiano un feed CSV (o TSV). Dopo che il tuo CMS ha rigenerato il feed, fai diff contro la copia known-good di ieri sera per intercettare una regex che ha tolto gli zeri finali da price, una colonna di disponibilità che da in_stock è passata a out_of_stock su ogni riga per un bug di IF(), o un nuovo campo GTIN aggiunto dal team senza dirlo a nessuno.
Diffare due export CSV di Salesforce o HubSpot
Quando un sales op chiede "quali contatti sono cambiati dalla scorsa settimana?", esporta lo stesso report due volte (allora e adesso) e fai diff dei due file. Il CSV non sarà ordinato per ID record di default, quindi prima ordina entrambi i lati sulla colonna ID; altrimenti ogni riga sembra rimescolata. Una volta ordinato, le modifiche reali (uno status di lead passato da MQL a SQL, un'email corretta dopo un bounce) emergono chiaramente.
Confrontare l'output di una pipeline con quello di ieri
Un job ETL notturno scrive un CSV su S3. Il numero di righe di oggi è sospettosamente diverso da quello di ieri. Tira giù entrambi i file, falli diff, e trovi la deriva di schema: è apparsa una colonna nuova a metà tabella perché l'API a monte ha aggiunto un campo, e questo ha spostato di una posizione ogni cella a valle. Il diff coglie il cambiamento strutturale all'istante, mentre un controllo del solo conteggio righe ti direbbe solo che qualcosa non torna.
Rivedere un CSV di risultato di test A/B dal team stats
Il data scientist consegna un CSV con i risultati dell'esperimento. Rilancia l'analisi dopo una modifica metodologica. Diff v1 contro v2: sono cambiate solo le colonne di statistiche del test, o si sono mossi anche i conteggi di assegnazione (il che vorrebbe dire che la definizione di coorte si è spostata)? Diffare onestamente gli output dell'analisi è il controllo più economico prima di rilasciare una feature basata sul risultato.
Riferimento rapido CSV
Un breve riassunto per i casi limite di parsing che questo strumento fa emergere più spesso. Il riferimento grammaticale è RFC 4180 più ciò che gli strumenti di foglio di calcolo realmente emettono.
| Topic | What this tool does |
|---|
| Virgolette secondo RFC 4180 | I campi che contengono virgole, doppie virgolette o ritorni a capo devono essere racchiusi tra doppie virgolette. "Widget, small" è un solo campo. Valori semplici come 4.99 non hanno bisogno di virgolette. Vedi RFC 4180. |
|---|
| Doppie virgolette escapate | Una " letterale dentro un campo tra virgolette si fa l'escape raddoppiandola. "He said ""hi""" è il valore He said "hi". L'escape con backslash non è CSV standard, anche se alcuni strumenti lo accettano. |
|---|
| Ritorni a capo annidati | I ritorni a capo sono ammessi dentro un campo tra virgolette secondo RFC 4180. Un indirizzo su più righe in una sola cella è CSV valido. Il diff tratta ogni riga fisica come un'unità, quindi un campo che contiene un a-capo può mostrare modifiche sulla riga di avvolgimento. |
|---|
| Fine riga (CRLF vs LF) | RFC 4180 dice CRLF (\r\n). Excel emette CRLF. La maggior parte degli strumenti Unix emette LF. Mischiando i due tra pannello sinistro e destro ogni riga sembra cambiata. Normalizza i fine riga prima di diffare. |
|---|
| BOM (UTF-8) | I CSV salvati da Excel iniziano spesso con un BOM UTF-8 (EF BB BF). La FAQ Unicode sul BOM lo segna come opzionale e inutile per UTF-8. Un BOM disallineato tra i due file produce un diff fantasma sulla riga 1. |
|---|
| Dialetti di delimitatore | La virgola è il default; gli export di Excel europeo usano il punto e virgola (;) perché in molte locale la virgola è il separatore decimale. TSV (separato da tab) è una variante comune; vedi il contesto TSV. Entrambi i file devono usare lo stesso delimitatore per un diff sensato. |
|---|
| Righe di intestazione | Questo strumento tratta la riga 1 come dato. Una rinominazione di colonna appare come diff di una sola riga in cima. Se vuoi confrontare solo le righe del corpo, togli l'header da entrambi i pannelli prima di incollare. La maggior parte dei parser (csv.DictReader di Python, pandas) tratta la riga 1 come header per convenzione, ma il formato non lo richiede. |
|---|
| Codifica | Solo UTF-8 tramite il FileReader del browser. Latin-1 (ISO-8859-1) e Windows-1252 si caricano ma rendono i caratteri accentati deformati. Converti con iconv o "Save with Encoding" di VS Code prima di incollare. |
|---|
Diff CSV: domande frequenti
Riordinare righe o colonne di un CSV produrrà un diff rumoroso?
Sì: il motore confronta i caratteri riga per riga, quindi riordinare righe o colonne apparirà come differenza anche quando i dati sottostanti sono identici. È un diff testuale, con qualche aiuto di lettura consapevole del CSV. Non c'è abbinamento per chiave di riga, né consapevolezza del riordino di colonne, né comprensione semantica dei tipi. Per quel livello di confronto, usa uno strumento come csvkit, pandas con un merge su chiave primaria, o carica entrambi i file in SQLite e lancia una query EXCEPT. Per il confronto di fogli di calcolo di tutti i giorni, questo strumento copre la maggior parte di ciò che ti serve.
Come gestisco i fine riga CRLF di Windows vs LF di Unix?
Excel scrive CSV con CRLF (\r\n), il csv.writer di Python di solito scrive LF (\n), e una pipeline di shell può produrre entrambi a seconda dei flag. Se un pannello è CRLF e l'altro LF, il diff vede una differenza in ogni singola riga. La soluzione è normalizzare entrambi i lati prima di incollare: aprili nello stesso editor e salvali con un solo fine riga, o fai passare uno dei due per dos2unix o unix2dos. RFC 4180 impone CRLF, ma i file CSV nel mondo reale usano entrambi.
Lo strumento gestisce il riordino delle colonne?
No. Questo è un diff testuale riga per riga. Se la riga 1 ha le colonne nell'ordine sku,name,price a sinistra e name,sku,price a destra, ogni cella su ogni riga sembrerà cambiata perché il diff vede testo grezzo, non un modello a colonne. Lo stesso vale se ordini i due file su colonne diverse. Riordina colonne e righe perché combacino prima di diffare, o ricorri a uno strumento consapevole delle chiavi come csvjoin di csvkit o un merge di pandas quando il modello a colonne conta davvero.
Come gestisce lo strumento il BOM UTF-8 che aggiunge Excel?
Excel su Windows scrive spesso un byte order mark UTF-8 all'inizio di un CSV (i byte EF BB BF), anche se la FAQ Unicode sul BOM dice che è inutile per UTF-8. Se uno dei tuoi file ha un BOM e l'altro no, vedrai un diff fantasma di un carattere alla riga 1, colonna 1. Apri il file in un editor di testo serio (VS Code, Notepad++, Sublime) e risalva senza BOM, o togli i primi tre byte a mano prima di incollare.
Quali codifiche accetta lo strumento?
UTF-8 è l'unica codifica che il percorso del FileReader decodifica correttamente qui. Un file Latin-1 o Windows-1252 si carica ma i caratteri accentati appariranno deformati (es. café diventa café). UTF-16 con BOM apparirà completamente rotto. Converti prima i file non UTF-8: nel terminale, iconv -f WINDOWS-1252 -t UTF-8 input.csv > out.csv; in VS Code, usa "Reopen with Encoding" e poi "Save with Encoding" su UTF-8. Il modulo csv di Python e pandas permettono entrambi di specificare la codifica sorgente in lettura.
Quanto può essere grande un file CSV da diffare?
Fino a qualche MB va bene e si sente istantaneo. Sopra i 10 MB il browser inizia a sentirlo, e la maggior parte del costo è renderizzare il diff evidenziato (non calcolarlo). Per export molto grandi (50 MB+), filtra prima entrambi i file alle colonne o righe che ti interessano davvero. csvcut e csvgrep di csvkit, jq per CSV convertito in JSON, o un veloce awk/grep vanno tutti bene come pre-passata. Poi incolla qui la fetta tagliata.
Privacy e come funziona
Il tuo CSV non lascia mai il browser. Il lettore, il diff e il rendering girano tutti sulla tua macchina, in locale. Niente analytics sull'input, niente log, nessuna andata e ritorno "utile" verso il cloud. Per controllare, apri i DevTools, passa alla scheda Network e osserva. Non ci sono richieste in uscita quando confronti. Il riferimento di formato è RFC 4180, e la documentazione del modulo csv di Python è il riferimento contro cui verifichiamo i casi limite di parsing.