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.
| Vad du ser i diffen | Är det en riktig ändring? | Vad du ska göra |
|---|---|---|
| Rader i en annan ordning | Nej, om datan är samma uppsättning | Sortera båda filerna på en nyckelkolumn |
| Komma vs. semikolon som avgränsare | Nej, samma fält | Normalisera till en avgränsare |
Ada vs. "Ada" | Nej, citattecken är valfria här | Normalisera citattecken |
| CRLF- vs. LF-radslut | Nej | Normalisera radsluten |
| En tom rad i slutet | Nej | Ta bort den |
| Ett cellvärde har ändrats | Ja | Undersö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.
| Metod | Bäst för | Insats | Förstår CSV? |
|---|---|---|---|
| Titta med blotta ögat | Pyttesmå filer, en handfull rader | Låg | Nej, du är parsern |
| Diff-verktyg online | Snabba kontroller, klistra in varifrån som helst | Låg | Rad för rad, ja |
| Kalkylprogram | Visuell granskning, formler, filtrering | Medel | Ja, men manuellt |
Kommandorad (sort, csvkit) | Stora filer, skript, nyckelbaserade jämförelser | Medel | Ja, 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.
- Se till att båda filerna använder samma avgränsare och har samma rubrikrad.
- Om radordningen inte spelar roll, sortera båda filerna på en nyckelkolumn först.
- Öppna CSV-jämförelseverktyget.
- Klistra in originalet till vänster och den nya versionen till höger.
- 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:
| Rad (efter id) | Kolumn | Före | Efter | Ändring |
|---|---|---|---|---|
| 7 | role | editor | admin | Ändrad |
| 7 | seats | 3 | 5 | Ändrad |
| 8 | — | — | — | Ingen ä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
| Fallgrop | Varför den biter | Lösning |
|---|---|---|
| Avgränsare som inte matchar | Komma vs. semikolon får varje fält att se olika ut | Normalisera till en avgränsare först |
| BOM i början | En dold byte-order-markering ändrar den första rubrikcellen | Ta bort BOM innan du jämför |
| ID med inledande nollor | Ett kalkylblad kan ha gjort om 007 till 7 | Behåll ID-kolumner som text; jämför som strängar |
| Inbäddade radbrytningar | Ett citerat fält kan innehålla en radbrytning, vilket förskjuter varje senare rad | Använd en riktig CSV-parser, inte en raddelning |
| Eftersläpande mellanslag i celler | Osynliga mellanslag visas som en ändring | Trimma 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.