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
- Inventory and product feed updates — see exactly which prices, stock levels or titles changed between two Shopify or Google Merchant exports.
- Customer list updates — find who was added, removed, or had contact details changed between two CRM exports.
- Monthly reports — confirm what actually moved between this month's and last month's export before you trust the numbers.
- Migration QA — compare data before and after a system migration to confirm nothing was silently dropped or altered.
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.