Compare CSV exports by key
See what changed between two exports, even if their rows moved. Duplicate and blank keys are excluded visibly so an ambiguous match never silently picks a winner.
Preview: treat results as a review aid; check exclusions before using them to update another system.
1. Old export
2. New export
Per input: UTF-8 text, at most 2 MiB, 20,000 data records, 100 columns, and 200,000 total cells. One header row required. No automatic separator detection or numeric conversion. Choosing a file replaces that side’s pasted text, even if rejected; paste or choose a valid replacement to continue.
Use a column such as an ID that identifies one record. Headers and nonblank keys match exactly, including case, spaces, and leading zeroes. Empty or whitespace-only keys are excluded. Duplicate keys on either side exclude all matching records on both sides.
Ready for two exports.
Comparison report
Schema differences
All named columns are compared. A missing column differs from an empty cell, so adding or removing a column marks matched records as changed. Reordering existing columns alone does not change a record.
Changed cells
String values use JSON quotation so spaces and newlines remain visible. Record numbers count the header as record 1; multiline records can start on a different physical line.
Excluded records
duplicate_key: repeated in that export. ambiguous_other_side: unique here, duplicated in the other export. blank_key: empty or whitespace-only.
Added, removed, and unchanged
Download the complete report
Spreadsheet-prefix mode adds a leading apostrophe to cells beginning with =, +, -, @ (also after whitespace), or leading tab/newline characters. This changes those report values and reduces formula interpretation in many spreadsheets; it is not a universal safety guarantee. Literal CSV preserves fields but a spreadsheet may execute a formula. Inspect risky files as text, or use the exact JSON report. Changing spreadsheet import settings or resaving a file can alter protection.
CSV has summary/schema metadata and one row per changed, unchanged, added, removed, or excluded record; its detail column contains JSON. JSON includes exact original strings and all source record references. Preview tables show at most 100 entries each; successful downloads contain every entry. CSV reports have an inclusive 2 MiB UTF-8 output limit, including quoting and prefixes. Oversized CSV is blocked without a partial download; the exact JSON report remains available.
Worked example: a small amount export
Imagine two synthetic exports with columns id,amount. The old export contains A=10, B=20, C=30. The new export contains C=30, A=11, D=40. Choose id as the key.
- A changed: amount went from the string “10” to “11”.
- B was removed, D was added, and C is unchanged despite moving to the first row.
- Both exports have 3 records: old = 1 changed + 1 unchanged + 1 removed; new = 1 changed + 1 unchanged + 1 added.
If A appears twice in the old export, both old A records and the new A record are excluded. The new A is not called “added”: its matching old record is ambiguous. A blank key is excluded independently. Use the row references to resolve these records in your original files and compare again.
Supported inputs and exact matching
Choose comma or tab separators for each input. Quoted separators, doubled quotes, quoted newlines, empty cells, and a leading UTF-8 BOM are supported. Values such as 00123 and 123 stay different strings. A, a, and A are separate keys. There is no date, number, case, or whitespace normalization.
Blank or repeated headers, inconsistent field counts, invalid UTF-8, NUL bytes, and malformed quotes block the whole comparison. Blank lines are records, not silently skipped; they may fail field counts or be excluded as blank keys. Empty and header-only exports remain distinguishable. A leading BOM is removed; line-ending characters inside quoted cells are preserved and can themselves produce a difference.
Data handling
File contents are read and compared locally in this page; they are not uploaded. This pilot stores no input in browser storage and includes no analytics or advertising. The hosting service receives requests for the page and its static assets. Downloads happen when you choose them. Clearing removes displayed input and results; downloaded files remain on your device. Browser extensions and other software on your device are outside this page’s control.