CSV Cell Diff

Paste two CSVs to align them column-by-column and see exactly which cells changed — with optional key-column row matching, all in your browser.

Try:
Diff

CSV Cell Diff

Compare two CSV files column-by-column and see exactly which individual cells changed — not just which lines differ. Unlike a plain text diff, this tool understands column structure: it lines columns up by header name (so reordered columns still match) and can pair rows by a key column (so reordered rows still match), then reports every changed cell with its old and new value, plus which rows and whole columns were added or removed. Everything runs locally in WebAssembly — your data never leaves the browser.

Worked example

Original CSV

id,name,price
1,Apple,10
2,Banana,20
3,Cherry,30

Updated CSV

id,name,price
1,Apple,12
2,Banana,20
4,Date,15

With Key column(s) = id and Output format = table:

3 columns compared
1 rows changed · 1 rows added · 1 rows removed · 1 rows unchanged · 1 cells changed
~ [1] price: "10" → "12"
- [3] id=3, name=Cherry, price=30
+ [4] id=4, name=Date, price=15

Row 1's price cell changed 10 → 12, row 4 is new, and row 3 was removed. Row 2 is unchanged. Switch Output format to json for a structured report (with per-cell old/new and summary counts) or csv for a flat row_key,status,column,old,new change-log you can pipe into another tool.

The same example through the gizza CLI:

gizza tool csv-cell-diff left=$'id,name,price\n1,Apple,10\n2,Banana,20\n3,Cherry,30' right=$'id,name,price\n1,Apple,12\n2,Banana,20\n4,Date,15' key=id format=table

Inputs

Limits & notes

FAQ

How is this different from a plain text diff?

A text diff compares whole lines, so moving a row or reordering columns shows up as a big change. This tool parses the CSV structure: it aligns columns by header name and (with a key column) matches rows by identity, then reports the specific cells that differ. The result points at row → column: old → new, not just "this line changed".

What does the key column do, and can I use more than one?

The key column(s) identify each row so the tool can match the same record across both files even if the rows were reordered. Give a single column like id, or several comma-separated columns like first,last for a composite key. Leave it empty to compare rows positionally (row 1 vs row 1). Columns can be referenced by header name or by 1-based index.

My two files have the columns in a different order — is that a problem?

No. When the first row is treated as a header, columns are aligned by name, so a file with price,id,name compares correctly against one with id,name,price. Only columns that exist in both files are compared cell-by-cell; a column present on just one side is reported as added or removed.

When should I pick the JSON or CSV output instead of the table?

Use table for a quick, readable review. Use json when a script needs the structured result — it includes the common/added/removed columns, summary counts, and a per-row list of changed cells with old and new values. Use csv for a flat row_key,status,column,old,new change-log that you can open in a spreadsheet or feed into another CSV tool.

Does my data get uploaded anywhere?

No. The comparison runs entirely in your browser via WebAssembly. Nothing is sent to a server, so it is safe to diff private or sensitive exports.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool csv-cell-diff "id,name,price
1,Apple,10
2,Banana,20" 'right=id,name,price
1,Apple,12
2,Banana,20'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/csv-cell-diff/?left=id%2Cname%2Cprice%0A1%2CApple%2C10%0A2%2CBanana%2C20&right=id%2Cname%2Cprice%0A1%2CApple%2C12%0A2%2CBanana%2C20&key=id&delimiter=comma&header=true&ignore_case=true&ignore_whitespace=true&format=table

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.