Compare Two CSV Files Online

Compare added, removed and changed rows without uploading your files. Match row-for-row by position, or by a key column such as SKU, ID or email so a re-sorted or re-exported file still lines up correctly. Duplicate key values are detected and flagged, never silently guessed at.

Quick Answer: CSVUndo compares two CSV files locally to find added, removed, and modified cells or rows without uploading either file. It matches rows by row position or unique key identifiers (such as SKU, ID, or Email) while enforcing complete data confidentiality via a connect-src 'none' CSP rule.

Original CSV

Drop the original file here or click to choose
e.g. products-old.csv — read locally, never uploaded

Updated CSV

Drop the updated file here or click to choose
e.g. products-new.csv — read locally, never uploaded
How should rows be matched?
Options

These options only affect how values are compared — they never change the values shown in the results or the downloaded report.

🔒 Try it: switch off your Wi-Fi — the comparison still runs, because neither file ever leaves this tab. Prove it in 30 seconds →

How to compare two CSV files

Drop the older version into Original CSV and the newer one into Updated CSV. Choose how rows should be matched, then click Compare. Everything runs locally — for a business file (customer list, inventory feed, financial export) that is often the only acceptable way to compare two versions at all.

Compare by key column

Row position only works when both files list records in exactly the same order. The moment either file gets re-sorted, filtered, or has a row inserted partway through, a position-based compare reports the wrong row as “changed” for every row after that point. Matching by a key column — SKU, Order ID, Email, Customer ID — fixes this: each row is matched to its counterpart by that value, regardless of where it sits in either file. Composite keys are supported too, for records only unique across two columns together (Order ID + Line Item ID, for example).

What happens when row order changes?

Nothing, as long as you compare by key column rather than row position. A reordered row is matched to its counterpart by key and compared normally — it will not show up as added, removed, or (unless a value genuinely changed) even as changed. Row position comparison, by contrast, is deliberately literal: row 1 against row 1, row 2 against row 2. Use it only when you know the order did not change, or when there is no reliable key column to match on.

How duplicate keys are handled

If the column you chose as a key repeats — two rows both reading SKU-104, say — CSVUndo does not guess which one to match. It reports the duplicate (which file, which value, how many times) and leaves every row carrying that key out of the comparison entirely. A silently wrong match is worse than an honest gap: it would look like a normal result while actually comparing the wrong pair of rows. If you see a duplicate-key warning, either pick a column that is genuinely unique in both files, or switch to Row position comparison.

How column changes are handled

Columns are matched by their header name (case-insensitive), not their position, so moving a column doesn’t make every row in it look changed. A column that exists in one file but not the other is reported separately as added or removed, and is left out of the cell-by-cell comparison — there is nothing on the other side to compare it against.

Common CSV comparison use cases

Not sure what's wrong with a file, not what changed between two?

CSV Compare answers "what's different between these two files". For "what's wrong with this one file", run CSV Doctor instead.

Open CSV Doctor →

🔒 Your files never leave this tab — we can’t read, store or leak what we never receive. See the proof →

Privacy

Both files are read locally with the browser's own FileReader, and the comparison — including the key matching, duplicate detection, and diff report — runs entirely in JavaScript in this tab. Nothing is uploaded, and this page makes no network request at all while comparing.

Frequently asked questions

How do I compare two CSV files by a key column instead of row order?

Choose "Key column" instead of "Row position", then pick the column that identifies each record the same way in both files — SKU, Order ID, Email. Rows are matched by that value no matter what order they appear in, so a re-sorted or re-exported file still compares correctly.

What happens if a key value appears more than once?

CSVUndo detects it and tells you — for example "3 duplicate SKU values found in Original CSV" — and leaves every row carrying that key out of the comparison rather than guessing which one to match. A comparison built on an ambiguous key would be wrong in a way you might not notice, so those rows are reported separately instead. Pick a column that is actually unique, or switch to Row position comparison.

Does it matter if the columns are in a different order in each file?

No. Columns are matched by their header name, not their position, so a reordered column still lines up correctly and is not reported as added or removed. A genuinely new or missing column is reported separately as a schema change.

Are my files uploaded when I compare them?

No. Both files are read locally with the browser's own FileReader, and the comparison runs in JavaScript in this tab. Neither file ever leaves your device, and the page keeps working offline once it has loaded.