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.

Ligner en ændring, er det som regel ikke
Hvad du ser i diffenEr det en rigtig ændring?Hvad du skal gøre
Rækker i en anden rækkefølgeNej, hvis dataene er det samme sætSortér begge filer efter en nøglekolonne
Komma vs. semikolon som afgrænserNej, samme felterNormalisér til én afgrænser
Ada vs. "Ada"Nej, citationstegn er valgfri herNormalisér citationstegn
CRLF- vs. LF-linjeafslutningerNejNormalisér linjeafslutninger
En tom linje til sidstNejFjern den
En celleværdi er ændretJaUndersø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.

MetodeBedst tilIndsatsForstår CSV?
Kigge med det blotte øjeBittesmå filer, en håndfuld rækkerLavNej, du er parseren
Online diff-værktøjHurtige tjek, indsætte fra hvor som helstLavRække for række, ja
RegnearksappVisuel gennemgang, formler, filtreringMellemJa, men manuelt
Kommandolinje (sort, csvkit)Store filer, scripting, nøglebaserede sammenligningerMellemJa, 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.

  1. Sørg for, at begge filer bruger den samme afgrænser og har den samme overskriftsrække.
  2. Hvis rækkefølgen ikke betyder noget, så sortér begge filer efter en nøglekolonne først.
  3. Åbn CSV-sammenligningsværktøjet.
  4. Indsæt originalen til venstre og den nye version til højre.
  5. 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:

Hvad der faktisk blev ændret
Række (efter id)KolonneFørEfterÆndring
7roleeditoradminÆndret
7seats35Ændret
8Ingen æ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

FaldgrubeHvorfor den biderLøsning
Afgrænsere, der ikke matcherKomma vs. semikolon får hvert felt til at se forskelligt udNormalisér til én afgrænser først
BOM i startenEt skjult byte-order-mærke ændrer den første overskriftscelleFjern BOM før sammenligning
ID'er med foranstillede nullerEt regneark kan have lavet 007 om til 7Behold ID-kolonner som tekst; sammenlign som strenge
Indlejrede linjeskiftEt citeret felt kan indeholde et linjeskift, der forskyder hver efterfølgende rækkeBrug en rigtig CSV-parser, ikke en linjeopdeling
Efterstillede mellemrum i cellerUsynlige mellemrum vises som en ændringTrim 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.