Command Palette

Search for a command to run...

CSV Diff: confronta due file CSV senza una differenza di riga che ti sta mentendo

CSV Diff: confronta due file CSV senza una differenza di riga che ti sta mentendo

T
Toolz Team
|Aug 23, 2026|17 min letto

Parte della raccolta diff e confronta

Il bug report che mi ha fatto costruire questo era lungo tre parole: & quot; la sincronizzazione sta facendo cadere righe.& quot; Un feed del prodotto client's è arrivato come CSV notturno, il mio importatore Laravel lo ha riscritto, e da qualche parte tra i due file una manciata di SKU stava svanendo Il mio primo istinto era quello ovvio: butta entrambi i file in una riga diff. Il diff è tornato rosso fisso Ogni singola riga era & quot; cambiata, & quot; perché l'esportazione era stata riordinata da una colonna diversa quella notte, quindi la riga 4 nel vecchio file era la riga 900 nel nuovo Il diff della riga era tecnicamente corretto e completamente inutile Quello che in realtà mi serviva era uno strumento che capisse che il file era una tabella, abbinata ogni riga alla sua controparte dalla SKU, e mi dicesse quali record erano stati realmente aggiunti, rimossi o modificati Quello strumento è il Toolz Controllore differenziale CSV, e questa guida è il ragionamento alla base.

tl; dr: Un CSV diff confronta due file CSV come dati strutturati invece che come righe di testo Corrisponde alle righe di una colonna chiave come id oppure email e ogni record viene confrontato con la sua controparte ovunque si sia spostato nel file, quindi un'esportazione ri-ordinata non riporta migliaia di false modifiche Lo strumento Toolz analizza entrambi i file con una macchina a stati RFC 4180, suddivide il risultato in righe aggiunte, rimosse e modificate e mostra la cella esatta che differisce per ogni riga modificata Esegue interamente lato client: nessun caricamento, nessuna registrazione, funziona offline.

Costruisco prodotti SaaS su Laravel e React e spedisco plugin WordPress, il che significa che passo molto tempo a riconciliare le esportazioni: un sistema's vista dei dati rispetto ad un altro's, last night's snapshot contro stasera's, il file che un client giura di aver inviato rispetto al file che è effettivamente arrivato CSV è la lingua franca per tutto questo, e confrontare correttamente due CSV è uno di quei compiti che sembra banale finché non provi a farlo con lo strumento sbagliato Questa è la guida che vorrei che la versione frustrata di me avesse letto.

Che cosa è un CSV diff checker?

Un CSV diff checker prende due file CSV, una versione originale e una modificata, e riporta come la seconda differisce dalla prima a livello di righe e celle Invece dell'output delle righe aggiunte ed eliminate di un text diff, si ottengono quattro bucket: righe che esistono solo nel nuovo file (aggiunto), righe che esistono solo nel vecchio file (rimosso), righe che esistono in entrambi ma i cui valori differiscono (modificato) e righe identiche (invariate) Per ogni riga modificata, un buon strumento va un livello più in profondità e nomina le colonne specifiche che si sono spostate, mostrando il vecchio valore accanto a quello nuovo.

La distinzione che fa funzionare il tutto è il modo in cui le righe vengono accoppiate tra i due file. Un differenziale CSV può corrispondere a una colonna chiave, trattando un valore come un id o un email come identità del record, o può corrispondere per posizione, confrontando la riga uno con la riga uno La corrispondenza delle chiavi è ciò che desideri quasi ogni volta che confronti le esportazioni, perché lo stesso record può atterrare su una riga diversa ogni volta che i dati vengono estratti La corrispondenza posizionale è per i file in cui il numero di riga stesso è significativo e stabile, come un registro numerato a cui viene aggiunto solo Scegliere la modalità giusta è la decisione più importante, ed è per questo che lo strumento Toolz lo mette in primo piano anziché indovinare.

Perché un diff di linea diventa completamente rosso su un'esportazione riordinata?

Questo è il fallimento che manda le persone alla ricerca di uno strumento specifico per CSV, quindi vale la pena capire con precisione Un text diff, il tipo incorporato in Git e in ogni editor di codice, confronta i file riga per riga e in ordine Esegue un algoritmo che trova la sottosequenza comune più lunga di righe e contrassegna tutto il resto come inserito o eliminato Questo è esattamente giusto per il codice sorgente, dove l'ordine delle righe è il significato del file Spostare una funzione e si è veramente cambiato il file.

Un'esportazione CSV è l'opposto L'ordine delle righe è solitamente un incidente di qualunque cosa ORDER BY la query è capitata in uso, e può cambiare tra due run che contengono dati identici Nel momento in cui l'ordine di ordinamento si sposta, un diff di riga vede quasi ogni riga in una nuova posizione, non riesce a allinearle e riporta l'intero file come modificato Le informazioni che volevi, che tre record hanno effettivamente cambiato, sono sepolte sotto migliaia di falsi positivi Il diff ha fatto il suo lavoro fedelmente; ha solo risposto a una domanda sulle righe quando avevi una domanda sui record.

Un CSV diff risolve questo problema analizzando prima il file in righe e colonne, quindi confrontando i record in base alla chiave anziché al numero di riga. Il riordinamento del file non ha alcun effetto, perché la SKU A-1007 viene confrontato con la riga con SKU A-1007 nell'altro file non importa dove si trova uno dei due Questo è l'intero motivo per cui esiste la categoria, ed è il motivo per cui raggiungo il Strumento diff CSV invece di git diff ogni volta che il file è dati anziché codice.

Che cosa ha a che fare RFC 4180 con il confronto dei file?

Tutto, perché non è possibile confrontare correttamente due CSV se non è possibile analizzarli correttamente prima CSV è stato utilizzato per decenni prima che qualcuno lo standardizzasse Nel 2005 l'IETF ha pubblicato RFC 4180, che descrive il formato comune e il text/csv Tipo MIME Non è una legge a cui ogni strumento obbedisce, ma è la cosa più vicina a un contratto condiviso, e definisce le regole che un confronto ingenuo sbaglia.

La regola che conta di più è la citazione Un campo può essere avvolto in virgolette doppie, e deve esserlo se contiene una virgola, una virgoletta doppia o un'interruzione di riga Una virgoletta doppia all'interno di un campo quotato viene sfuggita raddoppiandolo Quindi il valore "Doe, John" è un campo singolo, e "She said ""hi""" è il valore She said "hi". Un confronto che divide ogni riga su virgole taglierà "Doe, John" in due campi, spostare ogni colonna dopo di esso, e poi con sicurezza segnalare che la riga è cambiata quando non è stato Il Toolz diff esegue la stessa macchina di stato RFC 4180 che alimenta il Visualizzatore CSV: cammina il testo carattere per carattere, traccia se è all'interno di un campo citato e tratta una virgola o una nuova riga come separatore solo quando è fuori dalle virgolette Ottenere l'analisi a destra è una precondizione per ottenere il diff a destra, ed è la parte che gli script arrotolati a mano saltano quasi sempre.

Come faccio a confrontare due file CSV con lo strumento?

Il flusso è breve di proposito Incolla il file originale nella prima casella e il file modificato nella seconda, oppure fai clic su Carica campione per vedere un esempio funzionante in cui viene modificata una riga, ne viene aggiunta una e ne viene rimossa una.

Conferma il delimitatore Rileva automaticamente i punteggi virgola, punto e virgola, scheda e pipe in base alla coerenza con cui ciascuno divide le prime diverse righe nello stesso numero di colonne, che gestisce correttamente i file punto e virgola europei e le esportazioni separate da schede Se il rilevamento è sbagliato per i tuoi dati, impostalo a mano Lascia l'interruttore dell'intestazione acceso se la prima riga di ciascun file contiene nomi di colonne, che è ciò che alimenta il selettore chiave-colonna.

Ora scegli come vengono abbinate le righe Scegli una colonna chiave dal menu a discesa, solitamente un id, email, o SKU, e lo strumento confronta i record in base a quel valore Selezionare Posizione invece per confrontare riga per riga Due toggle perfezionano il confronto: attivare la corrispondenza senza distinzione tra maiuscole e minuscole se Active e active dovrebbe contare come lo stesso valore, e lasciare trim-whitespace su in modo che uno spazio iniziale vagante non si registri come una modifica Fare clic su Confronta, e il riepilogo mostra quattro conteggi a colpo d'occhio Aprire la scheda Modificato per espandere ogni riga modificata e vedere esattamente quali celle si sono spostate, o le schede Aggiunto e Rimosso per vedere le righe complete come tabella Quando si è fatto, Copia report o Scarica esporta un riepilogo in testo normale di ogni differenza, incluso il valore prima e dopo di ogni cella modificata, pronto per incollare in una richiesta di pull, un ticket o un'e-mail al client.

Quando dovrei abbinare per chiave contro per posizione?

Questa è la scelta che determina se il diff è utile o rumore, quindi ecco la regola che uso, impaginata come tabella.

situazione Abbinamento per perché
Esportazione di database o API che può essere riordinata Colonna chiave Lo stesso disco finisce su linee diverse ogni tiro; la chiave è la sua identità stabile
Riconciliare due sistemi' vista degli stessi record Colonna chiave Ti interessa se un record esiste e corrisponde da entrambe le parti, non dove si trova
Confrontando l'istantanea di ieri sera e #39; a stasera e #39; Colonna chiave Le righe vengono aggiunte e rimosse nel tempo, quindi i numeri di riga vanno alla deriva
Aggiungi solo registro o registro con un ordine fisso Posizione Il numero di riga è stabile e significativo; la riga N è veramente & quot; l'ennesimo evento"
Due file che conosci condividono esattamente lo stesso ordine di riga Posizione Non esiste alcuna chiave, ma l'ordine è garantito identico
Un file senza alcuna colonna univoca Posizione Non c'è nulla su cui digitare, quindi confronta in ordine e accetta la limitazione

La versione breve: raggiungere la corrispondenza delle chiavi per impostazione predefinita, perché la maggior parte dei CSV sono esportazioni di record che portano un identificatore Rientrare nella corrispondenza posizionale solo quando non c'è una chiave utilizzabile o quando l'ordine delle righe è veramente parte dei dati Se si sceglie una chiave e lo strumento avverte che la colonna contiene valori duplicati, cioè un segnale la colonna non è effettivamente univoca, e si dovrebbe o scegliere una chiave migliore o pulire la fonte Ho catturato più di un'esportazione interrotta proprio perché la colonna & quot; unique& quot; ID si è rivelato non essere.

Come mostra cosa è effettivamente cambiato di seguito?

Un conteggio di & quot;5 righe cambiato& quot; è un inizio, ma la domanda che hai veramente è & quot; cambiato come?& quot; Il Toolz diff risponde che per riga Quando un record abbinato differisce, confronta le due versioni colonna per colonna ed elenca solo le celle che si sono spostate, ciascuna mostrata come il valore precedente barrato accanto al nuovo valore Una riga cliente in cui solo il plan colonna è andata da free a pro riporta quella singola cellula, non l'intero record, quindi non ti restano due lunghe file che cercano di individuare l'unico campo che è cambiato.

Questa visualizzazione a livello di cella è dove un CSV diff guadagna il suo mantenimento su un foglio di calcolo's proprie caratteristiche di confronto, che tendono a evidenziare le celle con il colore ma non ti danno nulla da copiare o incollare in una recensione Il rapporto esportato scrive ogni cambiamento fuori nel testo: la chiave della riga, il nome della colonna, e il vecchio e nuovo valore In pratica incollo che direttamente nella descrizione di una richiesta di pull in modo che un revisore può vedere l'impatto dei dati di una migrazione senza aprire i file stessi È lo stesso istinto dietro lo strutturale JSON diff, che riporta le chiavi modificate con i loro percorsi piuttosto che i cambiamenti di riga rumorosi; entrambi gli strumenti esistono perché & quot;cosa ha cambiato& quot; è una domanda migliore di & quot; quali righe differiscono.& quot;

È sicuro confrontare file CSV sensibili online?

Per questo strumento, sì, e il motivo è architettonico piuttosto che una promessa mignolo Ogni passo, analizzando entrambi i file, le righe corrispondenti, calcolando le differenze per cella e costruendo il rapporto, viene eseguito come JavaScript all'interno della scheda del browser Non c'è caricamento, nessun server di andata e ritorno e nulla è registrato o memorizzato Puoi dimostrarlo aprendo il tuo browser's scheda di rete e facendo clic su Confronta: nessuna richiesta lascia la pagina Una volta caricata la pagina puoi disconnetterti completamente da Internet e continua a funzionare.

Ciò è importante perché le persone dei CSV differiscono tra i file più sensibili di proprietà di un'azienda Gli elenchi dei clienti, le esportazioni di transazioni, le righe delle buste paga, le tabelle dell'inventario e i registri di accesso viaggiano tutti come CSV Uno strumento di confronto che carica i tuoi file su un server, per quanto ben intenzionato, trasforma due fogli di calcolo privati in qualcun altro' le voci di registro dell'elaborazione lato client rimuove la domanda: i dati non lasciano mai la macchina su cui è iniziata. Tale impostazione predefinita è deliberata su ogni strumento su Toolz.dev e ho scritto l'argomento più lungo nel guida alla privacy dei dati per gli strumenti online per chiunque voglia il ragionamento completo.

Come si inserisce una differenza CSV in un flusso di lavoro reale?

Il diff è raramente l'intero lavoro; è una stazione in una pipeline Il pattern che ho colpito più spesso è la verifica: eseguo un'importazione o una migrazione, quindi diff il prima e dopo le esportazioni per confermare che lo script ha fatto esattamente quello che mi aspettavo e niente di più Un diff pulito di & quot; tre cambiato, zero rimosso" è un segno di gran lunga migliore una migrazione ha funzionato rispetto a un segno di spunta verde dallo script che l'ha eseguito Quando il diff mostra una rimozione che non intendevo, ho catturato il bug prima che raggiungesse la produzione invece che dopo.

Gli strumenti intorno ad esso dipendono da ciò che il file è per Se ho bisogno di guardare un file come una griglia ordinabile prima di confrontare, il Visualizzatore CSV rende la stessa analisi RFC 4180 come tabella Se il confronto che voglio riguarda davvero l'appartenenza, quali valori appaiono in un file ma non l'altro piuttosto che quali righe sono cambiate, il confronta due elenchi strumento imposta l'aritmetica su singole colonne ed è la soluzione migliore. E quando i dati devono diventare qualcosa che un'API può consumare, il Convertitore CSV a JSON è il prossimo salto Nessuno di questi carica i tuoi dati, quindi puoi incatenarli sullo stesso file privato senza pensarci due volte Se stai assemblando un kit per questo tipo di lavoro sui dati, mio Guida al kit per gli sviluppatori web cammina attraverso il modo in cui i pezzi si collegano.

Domande frequenti

Come faccio a confrontare due file CSV? Apri il Controllore differenziale CSV(Incolla il CSV originale nella prima casella e il CSV modificato nella seconda), conferma le impostazioni di delimitatore e intestazione, scegli una colonna chiave o una corrispondenza posizionale e fai clic su Confronta Il risultato viene suddiviso in righe aggiunte, rimosse e modificate e ogni riga modificata mostra le celle esatte che differiscono Tutto viene eseguito nel browser, quindi i file non vengono mai caricati.

Qual è la differenza tra corrispondenza delle chiavi e corrispondenza delle posizioni? Coppie di corrispondenza delle chiavi righe che condividono lo stesso valore in una colonna scelta, ad esempio id, quindi un record viene confrontato con la sua controparte ovunque appaia in entrambi i file La corrispondenza della posizione confronta la riga uno con la riga uno in ordine di file Usa la corrispondenza delle chiavi per le esportazioni che possono essere riordinate e la corrispondenza della posizione per i file di ordine fisso come un registro solo appendice.

Perché un diff di testo mostra ogni riga modificata quando i dati si spostano a malapena? Perché un testo diff confronta i file riga per riga e in ordine Se l'esportazione viene ri-ordinata, quasi ogni riga atterra in una nuova posizione e il diff contrassegna l'intero file come modificato, anche se i record sottostanti sono gli stessi Un CSV diff analizza il file in righe e colonne e confronta i record per chiave, quindi il ri-ordinamento non ha effetto e vengono riportate solo le modifiche autentiche.

Mostra quale cella specifica è cambiata di seguito? Sì. Quando una riga corrispondente differisce, lo strumento elenca ciascuna colonna modificata per nome e mostra il valore precedente accanto al nuovo valore Una riga in cui solo la colonna di stato è passata da attiva a chiusa riporta quella singola cella anziché contrassegnare l'intera riga.

Quali delimitatori supporta? virgola, punto e virgola, scheda e pipe Il delimitatore viene rilevato automaticamente dal primo file selezionando il separatore che produce un conteggio di colonne coerente nelle prime diverse righe e puoi sovrascriverlo manualmente quando il rilevamento è sbagliato per i tuoi dati.

Cosa succede se la mia colonna chiave ha valori duplicati? Lo strumento avvisa che la colonna chiave contiene duplicati e confronta solo la prima riga per ogni chiave Le chiavi duplicate di solito significano che la colonna non è un vero identificatore univoco, quindi l'avviso è un prompt per scegliere una chiave diversa o pulire i dati prima di fidarsi del diff.

I miei file CSV vengono caricati da qualche parte? No. Tutto il parsing e il confronto vengono eseguiti localmente nel browser con JavaScript semplice, Nulla viene trasmesso, registrato o memorizzato, e puoi confermarlo nella scheda di rete dove non appare alcuna richiesta Lo strumento continua inoltre a funzionare offline una volta che la pagina è stata caricata.

Quanto grande può gestire un file? La corrispondenza delle chiavi utilizza mappe hash anziché cicli nidificati, quindi scala in modo approssimativamente lineare e gestisce comodamente decine di migliaia di righe. Il limite pratico è che il tuo browser renda un set di risultati molto ampio, non il confronto stesso.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!