Sammenlign to CSV-filer og finn hva som er endret
Den raskeste måten å sammenligne to CSV-filer på er å lime begge inn i et diff-verktøy side ved side, stille opp kolonnene og lese radene det fremhever. Selve sammenligningen er den enkle delen. Det er støyen som skaper trøbbel for folk: en omstokket eksport, et semikolon i stedet for et komma eller en verdi noen har satt i anførselstegn, kan få to filer med de samme dataene til å se ut som om de ikke har noe til felles.
Denne guiden går gjennom hvordan du får en ren, pålitelig CSV-diff. Vi ser på hvorfor to likeverdige eksporter driver fra hverandre på papiret, hvilke metoder som er verdt å kunne, og et gjennomgått eksempel du kan følge. Vil du bare ha verktøyet, gjør vår CSV-sammenligningsside dette i nettleseren.
Hvorfor CSV-filer er bedragersk vanskelige å sammenligne
CSV ser enkelt ut, men har ingen enkelt streng standard. Det nærmeste er RFC 4180, og mange filer i den virkelige verden følger den ikke. To eksporter av den samme tabellen kan skille seg i skilletegn, anførselstegn, linjeslutt og radrekkefølge mens de beskriver nøyaktig de samme dataene. En vanlig tekstdiff vet ingenting om det og flagger derfor alt.
Her er det viktigste å avgjøre før du begynner: betyr radrekkefølgen noe for deg? En databaseeksport sortert etter navn og den samme eksporten sortert etter ID inneholder det identiske settet med poster, men en linjediff maler nesten hver rad rød og grønn. Hvis radene har en stabil nøkkel (en ID-kolonne), gjør en sortering av begge filene etter den nøkkelen først diffen lesbar igjen.
| Hva du ser i diffen | Er det en ekte endring? | Hva du skal gjøre |
|---|---|---|
| Rader i en annen rekkefølge | Nei, hvis dataene er det samme settet | Sorter begge filene etter en nøkkelkolonne |
| Komma vs. semikolon som skilletegn | Nei, samme felter | Normaliser til ett skilletegn |
Ada vs. "Ada" | Nei, anførselstegn er valgfrie her | Normaliser anførselstegn |
| CRLF- vs. LF-linjeslutt | Nei | Normaliser linjesluttene |
| En tom linje på slutten | Nei | Fjern den |
| En celleverdi er endret | Ja | Undersøk, denne er ekte |
Skilletegn-raden fanger mange, særlig på tvers av regioner: mange europeiske språkinnstillinger bruker semikolon fordi kommaet er desimaltegnet. Samme data, annet skilletegn. Vil du ha detaljene om hvordan nettlesere og verktøy leser tabulær tekst, er MDNs notat om å lese filer i nettleseren et nyttig utgangspunkt.
Fire måter å sammenligne CSV på, og når du bør velge hvilken
Det finnes ingen enkelt beste metode. Det avhenger av størrelsen på filene og om radrekkefølgen betyr noe. Slik står de vanlige alternativene.
| Metode | Best for | Innsats | Forstår CSV? |
|---|---|---|---|
| Se med det blotte øyet | Bittesmå filer, en håndfull rader | Lav | Nei, du er parseren |
| Online diff-verktøy | Raske sjekker, lime inn fra hvor som helst | Lav | Rad for rad, ja |
| Regnearkapp | Visuell gjennomgang, formler, filtrering | Middels | Ja, men manuelt |
Kommandolinje (sort, csvkit) | Store filer, skripting, nøkkelbaserte sammenligninger | Middels | Ja, når du sorterer først |
For de fleste vinner et nettleserverktøy på hastighet: ingenting å installere, og du kan lime inn en eksport rett fra en nedlasting eller en databaseklient. Haken er støyen fra radrekkefølge og skilletegn, som vi tar tak i nå. For svært store filer er csvkit på kommandolinjen verdt å lære.
Den raskeste rene sammenligningen, steg for steg
Dette er rutinen jeg bruker når noen rekker meg to eksporter og spør "hva er forskjellig?". Det tar under et minutt.
- Sørg for at begge filene bruker det samme skilletegnet og har den samme overskriftsraden.
- Hvis radrekkefølgen ikke betyr noe, sorter begge filene etter en nøkkelkolonne først.
- Åpne CSV-sammenligningsverktøyet.
- Lim inn originalen til venstre og den nye versjonen til høyre.
- Les resultatet. Grønt er en lagt til-rad, rødt er en fjernet rad, og en endret celle vises som én av hver.
Steg to er hele trikset når radene er usorterte. Når begge filene er sortert på samme måte, er det eneste som gjenstår å fremheve, radene som faktisk er endret. Diff-motoren vår er bygget på Googles diff-match-patch, som sammenligner rad for rad først og derfor forblir rask selv på lange filer.
Et gjennomgått eksempel
Si at du gjennomgår en endring i en brukertabell. Her er før:
id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1
Og her er etter, eksportert i en annen radrekkefølge:
id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5
Sleng dem inn i en rå linjediff, og begge dataradene ser endret ut, fordi de
byttet plass. Sorter begge etter kolonnen id, og den virkelige
historien er kort:
| Rad (etter id) | Kolonne | Før | Etter | Endring |
|---|---|---|---|---|
| 7 | role | editor | admin | Endret |
| 7 | seats | 3 | 5 | Endret |
| 8 | — | — | — | Ingen endring (bare flyttet) |
Én ekte redigering: Adas rolle og antall plasser ble endret. Alans rad ble
bare flyttet. Den opprykket fra editor til admin
er akkurat den typen ting du vil fange opp i en gjennomgang, og den er lett
å overse når den er begravd under rader som diffen feilaktig flagget som
endret.
Drep radrekkefølge-støyen på kommandolinjen
Hvis filene dine allerede ligger på disk og radene ikke har noen iboende rekkefølge, fungerer den samme "sorter først"-ideen med to korte kommandoer. Behold overskriften på plass, og sorter resten:
(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
Nå rapporterer diff bare rader som virkelig er endret, fordi
begge filene er i samme rekkefølge. For nøkkelbaserte sammenligninger som
også ignorerer kolonnerekkefølgen, gir csvkits csvsort og
csvjoin deg mer kontroll. Dette er terminal-motstykket til å
sortere begge sider før du sammenligner i nettleseren.
Skilletegn, anførselstegn og den rotete virkeligheten
Ekte CSV-filer bryter reglene hele tiden. Et felt som inneholder et komma må
settes i anførselstegn, så "Lovelace, Ada" er ett felt, ikke
to. Anførselstegn inne i et sitert felt dobles:
"Hun sa ""hei""". Og selve skilletegnet varierer: regneark i
språkinnstillinger med desimalkomma eksporterer med semikolon, og
tabulatorseparerte filer (TSV) er vanlige i datapipelines. Før du
sammenligner, sørg for at begge filene bruker det samme skilletegnet og den
samme anførselskonvensjonen, eller normaliser dem med en parser som følger
RFC 4180. Ellers sammenligner diffen to forskjellige dialekter, ikke to
versjoner av de samme dataene.
Vanlige fallgruver å se opp for
| Fallgruve | Hvorfor den biter | Løsning |
|---|---|---|
| Skilletegn som ikke matcher | Komma vs. semikolon får hvert felt til å se forskjellig ut | Normaliser til ett skilletegn først |
| BOM i starten | Et skjult byte-order-merke endrer den første overskriftscellen | Fjern BOM før sammenligning |
| ID-er med innledende nuller | Et regneark kan ha gjort 007 om til 7 | Behold ID-kolonner som tekst; sammenlign som strenger |
| Innebygde linjeskift | Et sitert felt kan inneholde et linjeskift som forskyver hver etterfølgende rad | Bruk en ekte CSV-parser, ikke en linjedeling |
| Etterstilte mellomrom i celler | Usynlige mellomrom vises som en endring | Trim celleverdier før sammenligning |
Når et regneark er det bedre verktøyet
En tekstdiff er perfekt for å se hvilke rader som er endret, og for å gjennomgå endringen som data. Men hvis du må filtrere, pivotere eller sammenligne med formel på tvers av tusenvis av rader, passer et regneark bedre: importer begge filene, still dem opp etter nøkkel, og bruk et oppslag til å flagge avvik. De to tilnærmingene utfyller hverandre. Bruk diffen til en rask visuell lesing og regnearket når du må skjære i dataene. For reglene for det underliggende formatet uansett er Wikipedias CSV-oversikt en solid referanse.
Relaterte verktøy
CSV er sjelden det eneste formatet du håndterer. Hvis de samme dataene også finnes som JSON, bruker JSON-sammenligning den samme ideen. Å fjerne duplikater i en kolonne med verdier går raskt med fjern dupliserte linjer, og å sette rader i en forutsigbar rekkefølge før en diff er akkurat det sorter linjer er til for.
Ofte stilte spørsmål
- Laster sammenligning av CSV-filer online dem opp noe sted?
- På comparetext.org kjører diffen i nettleseren din. De to CSV-filene sammenlignes av JavaScript på din egen maskin, så ingenting sendes til en server med mindre du uttrykkelig klikker på Lagre eller Del. Det gjør det trygt for kundeeksporter, finansielle data og andre regneark du ikke ville limt inn på et nettsted som laster opp ved hvert tastetrykk.
- Hvorfor viser de to CSV-filene mine hver rad som forskjellig?
- Nesten alltid er det radrekkefølgen eller skilletegnet, ikke ekte endringer. Den ene eksporten er sortert annerledes enn den andre, eller den ene bruker komma og den andre semikolon, eller linjesluttene er forskjellige. Sørg for at begge filene bruker det samme skilletegnet, og sorter så begge etter en nøkkelkolonne slik at rekkefølgen slutter å bety noe. Etter det krymper diffen som regel til den håndfullen rader og celler som virkelig er endret.
- Hvordan sammenligner jeg to CSV-filer mens jeg ignorerer radrekkefølgen?
- Sorter begge filene etter en stabil nøkkelkolonne før du sammenligner. Hvis radene har en ID, sorter etter den; ellers sorterer du hele raden. Behold overskriftsraden på plass, og sorter bare dataradene. I nettleseren kan du lime inn de sorterte versjonene; på kommandolinjen sorterer du filen etter overskriften. Når begge filene er i samme rekkefølge, dukker bare radene som faktisk er endret opp i diffen, i stedet for hver rad som bare har flyttet seg.
- Hvorfor bruker CSV-en min semikolon i stedet for komma?
- Mange europeiske språkinnstillinger bruker kommaet som desimaltegn, så regnearkapper eksporterer CSV med et semikolon-skilletegn i stedet for å unngå tvetydighet. Dataene er de samme; bare skilletegnet er forskjellig. Før du sammenligner to filer, sørg for at de bruker det samme skilletegnet, ellers ser du hvert felt flagget som endret. Å normalisere begge til komma (eller begge til semikolon) med et CSV-bevisst verktøy løser det. Tabulatorseparerte filer har det samme problemet med et annet skilletegn.
- Hvordan sammenligner jeg CSV-filer med ulik kolonnerekkefølge?
- En vanlig tekstdiff sammenligner rader fra venstre mot høyre, så omstokkede kolonner ser ut som en total endring selv når dataene stemmer. For å håndtere det, stokk om kolonnene slik at de matcher i begge filene først, eller bruk et CSV-bevisst verktøy som sammenligner etter overskriftsnavn i stedet for posisjon. Kommandolinjeverktøy som csvkit kan velge og stokke om kolonner etter navn. Når kolonnene står i samme rekkefølge, fungerer en vanlig rad-for-rad-diff igjen.
- Kan jeg sammenligne store CSV-filer uten at siden fryser?
- Ja, opp til et visst punkt. En diff i linjemodus forblir rask på filer med tusenvis av rader fordi den sammenligner hele linjer først i stedet for hvert tegn. Svært store filer (titalls megabyte eller millioner av rader) håndteres bedre med et kommandolinjeverktøy som csvkit eller en databaseimport, som strømmer dataene. For en eksport du komfortabelt kan bla gjennom i en nettleser, er en online diff det raskere alternativet.
Klar til å prøve det? Lim inn filene dine i CSV-sammenligningsverktøyet og se hva som er endret.