Sammenlign to CSV-filer og find ændringerne
Den hurtigste måde at sammenligne to CSV-filer på er at indsætte dem begge i et diff-værktøj side om side, justere kolonnerne og læse de rækker, det fremhæver. Selve sammenligningen er den nemme del. Det er støjen, der driller folk: en omrokeret eksport, et semikolon i stedet for et komma eller en værdi, som nogen har sat i citationstegn, kan få to filer med de samme data til at se ud, som om de intet har til fælles.
Denne guide gennemgår, hvordan du får en ren, pålidelig CSV-diff. Vi ser på, hvorfor to ækvivalente eksporter driver fra hinanden på papiret, hvilke metoder der er værd at kende, og et gennemarbejdet eksempel, du kan følge. Vil du bare have værktøjet, klarer vores CSV-sammenligningsside dette i browseren.
Hvorfor CSV-filer er bedragerisk svære at sammenligne
CSV ser enkelt ud, men har ingen enkelt streng standard. Det nærmeste er RFC 4180, og masser af filer i den virkelige verden følger den ikke. To eksporter af den samme tabel kan adskille sig i afgrænser, citationstegn, linjeafslutninger og rækkefølge, mens de beskriver præcis de samme data. En almindelig tekstdiff ved intet om det og markerer derfor det hele.
Her er det vigtigste at afgøre, før du går i gang: betyder rækkefølgen noget for dig? En databaseeksport sorteret efter navn og den samme eksport sorteret efter ID indeholder det identiske sæt poster, men en linjediff maler næsten hver række rød og grøn. Hvis rækkerne har en stabil nøgle (en ID-kolonne), gør en sortering af begge filer efter den nøgle først diffen læsbar igen.
| Hvad du ser i diffen | Er det en rigtig ændring? | Hvad du skal gøre |
|---|---|---|
| Rækker i en anden rækkefølge | Nej, hvis dataene er det samme sæt | Sortér begge filer efter en nøglekolonne |
| Komma vs. semikolon som afgrænser | Nej, samme felter | Normalisér til én afgrænser |
Ada vs. "Ada" | Nej, citationstegn er valgfri her | Normalisér citationstegn |
| CRLF- vs. LF-linjeafslutninger | Nej | Normalisér linjeafslutninger |
| En tom linje til sidst | Nej | Fjern den |
| En celleværdi er ændret | Ja | Undersøg, denne er rigtig |
Afgrænser-rækken fanger mange, især på tværs af regioner: mange europæiske sprogindstillinger bruger et semikolon, fordi kommaet er decimaltegnet. Samme data, anden afgrænser. Vil du have detaljerne om, hvordan browsere og værktøjer læser tabeltekst, er MDN's note om at læse filer i browseren et nyttigt udgangspunkt.
Fire måder at sammenligne CSV på, og hvornår du skal vælge hvilken
Der er ingen enkelt bedste metode. Det afhænger af filernes størrelse, og om rækkefølgen betyder noget. Sådan står de almindelige muligheder.
| Metode | Bedst til | Indsats | Forstår CSV? |
|---|---|---|---|
| Kigge med det blotte øje | Bittesmå filer, en håndfuld rækker | Lav | Nej, du er parseren |
| Online diff-værktøj | Hurtige tjek, indsætte fra hvor som helst | Lav | Række for række, ja |
| Regnearksapp | Visuel gennemgang, formler, filtrering | Mellem | Ja, men manuelt |
Kommandolinje (sort, csvkit) | Store filer, scripting, nøglebaserede sammenligninger | Mellem | Ja, når du sorterer først |
For de fleste vinder et browserværktøj på hastighed: intet at installere, og du kan indsætte en eksport direkte fra en download eller en databaseklient. Hagen er støjen fra rækkefølge og afgrænser, som vi tager fat på nu. Til meget store filer er csvkit på kommandolinjen værd at lære.
Den hurtigste rene sammenligning, trin for trin
Det er den rutine, jeg bruger, når nogen rækker mig to eksporter og spørger "hvad er forskelligt?". Det tager under et minut.
- Sørg for, at begge filer bruger den samme afgrænser og har den samme overskriftsrække.
- Hvis rækkefølgen ikke betyder noget, så sortér begge filer efter en nøglekolonne først.
- Åbn CSV-sammenligningsværktøjet.
- Indsæt originalen til venstre og den nye version til højre.
- Læs resultatet. Grøn er en tilføjet række, rød er en fjernet række, og en ændret celle vises som en af hver.
Trin to er hele tricket, når rækkerne er usorterede. Når begge filer er sorteret på samme måde, er det eneste, der er tilbage at fremhæve, de rækker, der faktisk er ændret. Vores diff-motor er bygget på Googles diff-match-patch, som sammenligner række for række først og derfor forbliver hurtig selv på lange filer.
Et gennemarbejdet eksempel
Sig, at du gennemgår en ændring i en brugertabel. Her er før:
id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1
Og her er efter, eksporteret i en anden rækkefølge:
id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5
Smid dem i en rå linjediff, og begge datarækker ser ændrede ud, fordi de har
byttet plads. Sortér begge efter kolonnen id, og den rigtige
historie er kort:
| Række (efter id) | Kolonne | Før | Efter | Ændring |
|---|---|---|---|---|
| 7 | role | editor | admin | Ændret |
| 7 | seats | 3 | 5 | Ændret |
| 8 | — | — | — | Ingen ændring (kun flyttet) |
Én rigtig redigering: Adas rolle og antal pladser blev ændret. Alans række
blev kun flyttet. Den forfremmelse fra editor til
admin er præcis den slags, du vil fange i en gennemgang, og den
er nem at overse, når den er begravet under rækker, som diffen fejlagtigt
markerede som ændret.
Dræb rækkefølge-støjen på kommandolinjen
Hvis dine filer allerede ligger på disken, og rækkerne ikke har nogen iboende rækkefølge, fungerer den samme "sortér først"-idé med to korte kommandoer. Behold overskriften på plads, og sortér 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
Nu rapporterer diff kun rækker, der virkelig er ændret, fordi
begge filer er i samme rækkefølge. Til nøglebaserede sammenligninger, der
også ignorerer kolonnerækkefølgen, giver csvkits csvsort og
csvjoin dig mere kontrol. Det er terminal-modstykket til at
sortere begge sider, før du sammenligner i browseren.
Afgrænsere, citationstegn og den rodede virkelighed
Rigtige CSV-filer bryder reglerne konstant. Et felt, der indeholder et
komma, skal sættes i citationstegn, så "Lovelace, Ada" er ét
felt, ikke to. Citationstegn inde i et citeret felt fordobles:
"Hun sagde ""hej""". Og selve afgrænseren varierer: regneark i
sprogindstillinger med decimalkomma eksporterer med semikolon, og
tabulatorseparerede filer (TSV) er almindelige i datapipelines. Før du
sammenligner, så sørg for, at begge filer bruger den samme afgrænser og den
samme citationskonvention, eller normalisér dem med en parser, der følger
RFC 4180. Ellers sammenligner diffen to forskellige dialekter, ikke to
versioner af de samme data.
Almindelige faldgruber at holde øje med
| Faldgrube | Hvorfor den bider | Løsning |
|---|---|---|
| Afgrænsere, der ikke matcher | Komma vs. semikolon får hvert felt til at se forskelligt ud | Normalisér til én afgrænser først |
| BOM i starten | Et skjult byte-order-mærke ændrer den første overskriftscelle | Fjern BOM før sammenligning |
| ID'er med foranstillede nuller | Et regneark kan have lavet 007 om til 7 | Behold ID-kolonner som tekst; sammenlign som strenge |
| Indlejrede linjeskift | Et citeret felt kan indeholde et linjeskift, der forskyder hver efterfølgende række | Brug en rigtig CSV-parser, ikke en linjeopdeling |
| Efterstillede mellemrum i celler | Usynlige mellemrum vises som en ændring | Trim celleværdier før sammenligning |
Hvornår et regneark er det bedre værktøj
En tekstdiff er perfekt til at spotte, hvilke rækker der er ændret, og til at gennemgå ændringen som data. Men hvis du skal filtrere, pivotere eller sammenligne med formel på tværs af tusindvis af rækker, passer et regneark bedre: importér begge filer, justér dem efter nøgle, og brug et opslag til at markere uoverensstemmelser. De to tilgange supplerer hinanden. Brug diffen til en hurtig visuel læsning og regnearket, når du skal skære i dataene. For reglerne for det underliggende format uanset hvad er Wikipedias CSV-oversigt en solid reference.
Relaterede værktøjer
CSV er sjældent det eneste format, du håndterer. Hvis de samme data også findes som JSON, anvender JSON-sammenligning den samme idé. At fjerne dubletter i en kolonne af værdier går hurtigt med fjern dublerede linjer, og at sætte rækker i en forudsigelig rækkefølge før en diff er præcis det, som sortér linjer er til for.
Ofte stillede spørgsmål
- Uploader sammenligning af CSV-filer online dem nogensteds?
- På comparetext.org kører diffen i din browser. De to CSV-filer sammenlignes af JavaScript på din egen maskine, så intet sendes til en server, medmindre du udtrykkeligt klikker på Gem eller Del. Det gør det sikkert til kundeeksporter, finansielle data og andre regneark, som du ikke ville indsætte på et site, der uploader ved hvert tastetryk.
- Hvorfor viser mine to CSV-filer hver række som forskellig?
- Næsten altid er det rækkefølgen eller afgrænseren, ikke rigtige ændringer. Den ene eksport er sorteret anderledes end den anden, eller den ene bruger kommaer og den anden semikoloner, eller linjeafslutningerne er forskellige. Sørg for, at begge filer bruger den samme afgrænser, og sortér så begge efter en nøglekolonne, så rækkefølgen holder op med at betyde noget. Derefter skrumper diffen som regel til den håndfuld rækker og celler, der virkelig er ændret.
- Hvordan sammenligner jeg to CSV-filer og ignorerer rækkefølgen?
- Sortér begge filer efter en stabil nøglekolonne, før du sammenligner. Hvis rækkerne har et ID, så sortér efter det; ellers sortér hele rækken. Behold overskriftsrækken på plads, og sortér kun datarækkerne. I browseren kan du indsætte de sorterede versioner; på kommandolinjen sorterer du filen efter overskriften. Når begge filer er i samme rækkefølge, dukker kun de rækker op i diffen, der faktisk er ændret, i stedet for hver række, der blot er flyttet.
- Hvorfor bruger min CSV semikoloner i stedet for kommaer?
- Mange europæiske sprogindstillinger bruger kommaet som decimaltegn, så regnearksapps eksporterer CSV med en semikolon-afgrænser i stedet for at undgå tvetydighed. Dataene er de samme; kun afgrænseren er forskellig. Før du sammenligner to filer, så sørg for, at de bruger den samme afgrænser, ellers ser du hvert felt markeret som ændret. At normalisere begge til kommaer (eller begge til semikoloner) med et CSV-bevidst værktøj løser det. Tabulatorseparerede filer har det samme problem med en anden afgrænser.
- Hvordan sammenligner jeg CSV-filer med forskellig kolonnerækkefølge?
- En almindelig tekstdiff sammenligner rækker fra venstre mod højre, så omrokerede kolonner ligner en total ændring, selv når dataene matcher. For at håndtere det skal du først omrokere kolonnerne, så de matcher i begge filer, eller bruge et CSV-bevidst værktøj, der sammenligner efter overskriftsnavn frem for position. Kommandolinjeværktøjer som csvkit kan vælge og omrokere kolonner efter navn. Når kolonnerne er på linje i samme rækkefølge, virker en almindelig række-for-række-diff igen.
- Kan jeg sammenligne store CSV-filer, uden at siden fryser?
- Ja, op til et vist punkt. En diff i linjetilstand forbliver hurtig på filer med tusindvis af rækker, fordi den sammenligner hele linjer først i stedet for hvert tegn. Meget store filer (titusindvis af megabyte eller millioner af rækker) håndteres bedre med et kommandolinjeværktøj som csvkit eller en databaseimport, der streamer dataene. For en eksport, du komfortabelt kan scrolle igennem i en browser, er en online diff den hurtigere mulighed.
Klar til at prøve det? Indsæt dine filer i CSV-sammenligningsværktøjet, og se, hvad der er ændret.