CSV Diff by Key

See what was added, removed and changed between two CSVs — in your browser, nothing uploaded.

Nothing you paste or drop is uploaded — the two files are compared entirely in this browser, so it can be used without a security review.

Old (baseline)left

Or drop a CSV/TSV file —

New (target)right

Or drop a CSV/TSV file —

Compare options

Options change comparison only — the original cells are always kept for display and export.

Paste or drop an Old and a New CSV above — or load the sample — to see which rows were added, removed and changed.

Frequently asked questions

Are my files sent to a server, and why can I use this without security approval?

No. This CSV diff tool runs 100% in your browser — the two files you paste or drop are parsed, normalized, joined and compared with JavaScript on your own machine, and nothing is uploaded, logged or stored on any server. There is no account and no network request that carries your data. That is exactly why inventory, accounting, HR and procurement teams can reconcile payroll files, customer lists or supplier tables here even when an upload-based diff SaaS would fail a security review: the data never leaves the tab. Close the tab and the tables are gone; only your compare options and the key/column choices are remembered in this browser's local storage — never the row data itself.

Can it still compare two CSVs when the rows and columns are in a different order?

Yes — that is the main difference from a plain text or line diff. Instead of comparing line 1 to line 1, this tool joins the two files by a key column you choose (an ID, email or SKU), the way a database or VLOOKUP would. Each row is matched to the row in the other file that shares the same key, so it stays accurate even when rows are sorted differently or columns are reordered or renamed. Pick the column that uniquely identifies a row; if no single column is unique, tick several columns to build a composite key (for example region + SKU). The tool auto-suggests a key that is unique in every row and warns you if none is.

Why does an identical value show up as changed, and how do I stop false changes?

By default the compare is exact text, which is deliberate: a leading zero in an employee or tax ID ("00123" vs "123") must not be silently treated as the same number, and dates and thousands separators are read differently around the world. When a cell looks changed but is really the same value, turn on the matching option that fits: "Compare as numbers" makes 1.234,56 (German) equal 1,234.56 (US) and 1,000 equal 1000; "Normalize dates before compare" reads 01/02/2026, 2026.1.5 and Excel serial numbers into one calendar date, using the country preset to resolve whether 01/02 means January 2 (US) or February 1 (EU/KR); and "Ignore leading zeros" folds 00123 into 123. These are off by default so nothing is changed silently.

What do added, removed, changed and unchanged mean, and which tab should I look at?

After joining by key, every key falls into exactly one bucket. Added is a key present only in the New file — a new hire, a new SKU, a payment with no prior record. Removed is a key present only in the Old file — someone who left, a discontinued item, an order that disappeared. Changed is a key present in both where at least one mapped value cell differs; the Changed tab lists each differing column with its old value next to the new value so you see precisely what moved. Unchanged is a key present in both with every value identical. For a reconciliation you usually watch Changed (what moved) and Added/Removed (what appeared or vanished); the summary line adds them up — +A −R ~C =U across N keys — as a quick sanity check.

How do I compare two CSVs with different headers, and how large a file can it handle?

If the two files use different column names, the tool shows a "Match columns" panel where you map each New column to its Old counterpart with a dropdown; columns that exist on only one side are labelled New-only or Old-only and are skipped when detecting changes. Tick "First row is a header" so the header is not compared as data. On size: a few tens of thousands of rows compare in milliseconds on the main thread, so there is no overkill machinery for small files. When the two files together exceed about 50,000 rows the parsing and join run in cancelable chunks with a progress bar, and very large inputs (beyond 200,000 rows per side or a 20 MB file) prompt you before processing instead of crashing or silently truncating — and any capping is always shown as a badge, never hidden.