Jämför två CSV-filer och hitta vad som ändrats

Det snabbaste sättet att jämföra två CSV-filer är att klistra in båda i ett diff-verktyg sida vid sida, rada upp kolumnerna och läsa de rader det markerar. Jämförandet är den lätta delen. Det är bruset som ställer till det för folk: en omflyttad export, ett semikolon i stället för ett komma eller ett värde som någon satt inom citattecken kan få två filer som innehåller samma data att se ut som om de inte har något gemensamt.

Den här guiden går igenom hur du får en ren, pålitlig CSV-diff. Vi tittar på varför två likvärdiga exporter driver isär på pappret, vilka metoder som är värda att kunna och ett genomarbetat exempel du kan följa. Vill du bara ha verktyget gör vår CSV-jämförelsesida detta i webbläsaren.

Varför CSV-filer är bedrägligt svåra att jämföra

CSV ser enkelt ut men har ingen enda strikt standard. Det närmaste är RFC 4180, och många filer i verkligheten följer den inte. Två exporter av samma tabell kan skilja sig i avgränsare, citattecken, radslut och radordning samtidigt som de beskriver exakt samma data. En vanlig textdiff vet inget om det och flaggar därför allt.

Här är det viktigaste att bestämma innan du börjar: spelar radordningen någon roll för dig? En databasexport sorterad på namn och samma export sorterad på ID innehåller den identiska uppsättningen poster, men en raddiff målar nästan varje rad röd och grön. Om raderna har en stabil nyckel (en ID-kolumn) gör en sortering av båda filerna på den nyckeln först att diffen blir läsbar igen.

Ser ut som en ändring, är det oftast inte
Vad du ser i diffenÄr det en riktig ändring?Vad du ska göra
Rader i en annan ordningNej, om datan är samma uppsättningSortera båda filerna på en nyckelkolumn
Komma vs. semikolon som avgränsareNej, samma fältNormalisera till en avgränsare
Ada vs. "Ada"Nej, citattecken är valfria härNormalisera citattecken
CRLF- vs. LF-radslutNejNormalisera radsluten
En tom rad i slutetNejTa bort den
Ett cellvärde har ändratsJaUndersök, detta är på riktigt

Avgränsarraden fångar många, särskilt mellan regioner: många europeiska språkinställningar använder semikolon eftersom kommat är decimaltecknet. Samma data, annan avgränsare. Vill du ha detaljerna om hur webbläsare och verktyg läser tabulär text är MDN:s anteckning om att läsa filer i webbläsaren en användbar utgångspunkt.

Fyra sätt att jämföra CSV och när du ska välja vilket

Det finns ingen enda bästa metod. Det beror på filernas storlek och om radordningen spelar roll. Så här står sig de vanliga alternativen.

MetodBäst förInsatsFörstår CSV?
Titta med blotta ögatPyttesmå filer, en handfull raderLågNej, du är parsern
Diff-verktyg onlineSnabba kontroller, klistra in varifrån som helstLågRad för rad, ja
KalkylprogramVisuell granskning, formler, filtreringMedelJa, men manuellt
Kommandorad (sort, csvkit)Stora filer, skript, nyckelbaserade jämförelserMedelJa, när du sorterar först

För de flesta vinner ett webbläsarverktyg på snabbhet: inget att installera, och du kan klistra in en export direkt från en nedladdning eller en databasklient. Haken är bruset från radordning och avgränsare, som vi tar itu med härnäst. För mycket stora filer är csvkit på kommandoraden värt att lära sig.

Den snabbaste rena jämförelsen, steg för steg

Det här är rutinen jag använder när någon räcker mig två exporter och frågar "vad är annorlunda?". Det tar under en minut.

  1. Se till att båda filerna använder samma avgränsare och har samma rubrikrad.
  2. Om radordningen inte spelar roll, sortera båda filerna på en nyckelkolumn först.
  3. Öppna CSV-jämförelseverktyget.
  4. Klistra in originalet till vänster och den nya versionen till höger.
  5. Läs resultatet. Grönt är en tillagd rad, rött är en borttagen rad, och en ändrad cell visas som en av vardera.

Steg två är hela tricket när raderna är osorterade. När båda filerna är sorterade på samma sätt är det enda som återstår att markera de rader som faktiskt ändrats. Vår diff-motor bygger på Googles diff-match-patch, som jämför rad för rad först och därför förblir snabb även på långa filer.

Ett genomarbetat exempel

Säg att du granskar en ändring i en användartabell. Här är före:

id,name,role,seats
7,Ada Lovelace,editor,3
8,Alan Turing,viewer,1

Och här är efter, exporterad i en annan radordning:

id,name,role,seats
8,Alan Turing,viewer,1
7,Ada Lovelace,admin,5

Släng in dem i en rå raddiff och båda dataraderna ser ändrade ut, eftersom de bytt plats. Sortera båda på kolumnen id, så är den verkliga historien kort:

Vad som faktiskt ändrades
Rad (efter id)KolumnFöreEfterÄndring
7roleeditoradminÄndrad
7seats35Ändrad
8Ingen ändring (bara flyttad)

En verklig redigering: Adas roll och antal platser ändrades. Alans rad bara flyttades. Den befordran från editor till admin är precis den sortens sak du vill fånga i en granskning, och den är lätt att missa när den är begravd under rader som diffen felaktigt flaggat som ändrade.

Döda radordningsbruset på kommandoraden

Om dina filer redan ligger på disk och raderna inte har någon inneboende ordning fungerar samma "sortera först"-idé med två korta kommandon. Behåll rubriken på plats och sortera 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 rapporterar diff bara rader som verkligen ändrats, eftersom båda filerna är i samma ordning. För nyckelbaserade jämförelser som också ignorerar kolumnordning ger csvkits csvsort och csvjoin dig mer kontroll. Det här är terminalmotsvarigheten till att sortera båda sidor innan du jämför i webbläsaren.

Avgränsare, citattecken och den röriga verkligheten

Riktiga CSV-filer bryter mot reglerna hela tiden. Ett fält som innehåller ett komma måste sättas inom citattecken, så "Lovelace, Ada" är ett fält, inte två. Citattecken inuti ett citerat fält dubbleras: "Hon sa ""hej""". Och själva avgränsaren varierar: kalkylblad i språkinställningar med decimalkomma exporterar med semikolon, och tabbavgränsade filer (TSV) är vanliga i datapipelines. Innan du jämför, se till att båda filerna använder samma avgränsare och samma citatkonvention, eller normalisera dem med en parser som följer RFC 4180. Annars jämför diffen två olika dialekter, inte två versioner av samma data.

Vanliga fallgropar att hålla utkik efter

FallgropVarför den biterLösning
Avgränsare som inte matcharKomma vs. semikolon får varje fält att se olika utNormalisera till en avgränsare först
BOM i börjanEn dold byte-order-markering ändrar den första rubrikcellenTa bort BOM innan du jämför
ID med inledande nollorEtt kalkylblad kan ha gjort om 007 till 7Behåll ID-kolumner som text; jämför som strängar
Inbäddade radbrytningarEtt citerat fält kan innehålla en radbrytning, vilket förskjuter varje senare radAnvänd en riktig CSV-parser, inte en raddelning
Eftersläpande mellanslag i cellerOsynliga mellanslag visas som en ändringTrimma cellvärden innan du jämför

När ett kalkylblad är det bättre verktyget

En textdiff är perfekt för att se vilka rader som ändrats och granska ändringen som data. Men om du behöver filtrera, pivotera eller jämföra med formel över tusentals rader passar ett kalkylblad bättre: importera båda filerna, rada upp dem på nyckel och använd en uppslagning för att flagga avvikelser. De två angreppssätten kompletterar varandra. Använd diffen för en snabb visuell läsning och kalkylbladet när du behöver skära i datan. För reglerna för det underliggande formatet hur som helst är Wikipedias CSV-översikt en gedigen referens.

Relaterade verktyg

CSV är sällan det enda formatet du hanterar. Om samma data också finns som JSON tillämpar JSON-jämförelse samma idé. Att rensa dubbletter i en kolumn med värden går snabbt med ta bort dubblettrader, och att ställa rader i en förutsägbar ordning före en diff är precis vad sortera rader är till för.

Vanliga frågor

Laddar jämförelse av CSV-filer online upp dem någonstans?
På comparetext.org körs diffen i din webbläsare. De två CSV-filerna jämförs av JavaScript på din egen dator, så ingenting skickas till en server om du inte uttryckligen klickar på Spara eller Dela. Det gör det säkert för kundexporter, finansiella data och andra kalkylblad som du inte vill klistra in på en sajt som laddar upp vid varje tangenttryckning.
Varför visar mina två CSV-filer varje rad som olika?
Nästan alltid är det radordningen eller avgränsaren, inte riktiga ändringar. En export är sorterad annorlunda än den andra, eller en använder komman och den andra semikolon, eller radsluten skiljer sig. Se till att båda filerna använder samma avgränsare, sortera sedan båda på en nyckelkolumn så att ordningen slutar spela roll. Efter det krymper diffen oftast till den handfull rader och celler som verkligen ändrats.
Hur jämför jag två CSV-filer och ignorerar radordningen?
Sortera båda filerna på en stabil nyckelkolumn innan du jämför. Om raderna har ett ID, sortera på det; annars sortera hela raden. Behåll rubrikraden på plats och sortera bara dataraderna. I webbläsaren kan du klistra in de sorterade versionerna; på kommandoraden sorterar du filen efter rubriken. När båda filerna är i samma ordning dyker bara de rader upp i diffen som faktiskt ändrats, i stället för varje rad som bara flyttats.
Varför använder min CSV semikolon i stället för komman?
Många europeiska språkinställningar använder kommat som decimaltecken, så kalkylprogram exporterar CSV med semikolon som avgränsare i stället för att undvika tvetydighet. Datan är densamma; bara avgränsaren skiljer sig. Innan du jämför två filer, se till att de använder samma avgränsare, annars ser du varje fält flaggat som ändrat. Att normalisera båda till komman (eller båda till semikolon) med ett CSV-medvetet verktyg löser det. Tabbavgränsade filer har samma problem med en annan avgränsare.
Hur jämför jag CSV-filer med olika kolumnordning?
En vanlig textdiff jämför rader från vänster till höger, så omflyttade kolumner ser ut som en total ändring även när datan stämmer. För att hantera det, ordna om kolumnerna så att de matchar i båda filerna först, eller använd ett CSV-medvetet verktyg som jämför på rubriknamn i stället för position. Kommandoradsverktyg som csvkit kan välja och ordna om kolumner efter namn. När kolumnerna ligger i samma ordning fungerar en vanlig rad-för-rad-diff igen.
Kan jag jämföra stora CSV-filer utan att sidan fryser?
Ja, upp till en viss gräns. En diff i radläge förblir snabb på filer med tusentals rader eftersom den jämför hela rader först i stället för varje tecken. Mycket stora filer (tiotals megabyte eller miljoner rader) hanteras bättre med ett kommandoradsverktyg som csvkit eller en databasimport, som strömmar datan. För en export du bekvämt kan scrolla igenom i en webbläsare är en diff online det snabbare alternativet.

Redo att prova? Klistra in dina filer i CSV-jämförelseverktyget och se vad som ändrats.