Everything runs in your browser. We never see your data. How we prove it β
CSV Compare β Diff Two CSV Files
Two exports, compared as a table. Rows are matched on a key column, and the cells that changed are named individually.
How two CSV exports are lined up
RFC 4180 lets a field hold a comma, a quote or a line break provided the field is wrapped in double quotes, with any embedded quote written twice. That rule has a consequence people trip over constantly: a line of a CSV file is not necessarily a line of text. An address record spilling across three physical lines is still one row, and splitting the file on newlines shreds it. The parser here follows the quoting rules, so `"Doe, Jane"` survives as one cell and `"she said ""no"""` comes back with real quote marks in it. The separator is sniffed first β comma, semicolon, tab or pipe β which spares you re-saving a European export where semicolons divide the fields precisely because the decimal comma sits inside them.
Rows are then matched, not merely stacked. The tool looks for a column whose values are unique on both sides β an order number, a SKU, an employee ID β and keys the comparison on it, so a file re-sorted by a different column still aligns with its counterpart and you count real additions, removals and edits rather than an apparent rewrite of everything. Without a usable key it matches by position. Inside a modified row the changed columns are named, so the report reads "row 4102: salary and grade" rather than leaving you to scan a wide line. Header detection is automatic, and the work happens in a Web Worker. Multi-sheet workbooks with formulas are a different problem β Excel Compare is built for those.
Exported tables are the last thing to upload
Think about what a CSV export usually is. A customer list with email addresses and postcodes. A payroll extract with names beside salaries. A transaction dump straight out of the finance system. Handing a file like that to an online comparison service is a data transfer nobody approved, and in several jurisdictions a reportable one. This page removes the question: the parser and the row matcher are JavaScript running in your tab, there is no upload control wired to a server, no account, and no copy retained anywhere. Open your browser's network tab while you use this tool β you'll see no request carries your content. Confirm it yourself in a minute.
Tables that get compared here
- A financial analyst closing the month sets the general-ledger extract against the reforecast. Keying on the account code means the two files agree even though one arrived sorted by cost centre and the other by amount.
- A compensation partner before a merit cycle compares the approved band file with the one returned by the business. Cell-level highlighting shows which twelve of nine hundred employees had a figure edited after sign-off, and by how much.
- An ecommerce operations manager on catalogue duty diffs yesterday's supplier price feed against today's to see which SKUs moved and which were withdrawn, before the catalogue import runs unattended overnight against a live storefront.
- A data engineer cutting over a warehouse runs the same query against the old system and the new one, exports both, and needs proof that the row counts and every last cell agree before the legacy pipeline is switched off for good.
Frequently asked questions
My two files are sorted differently. Will everything show as changed?
No, provided a column holds unique values on both sides. That column becomes the key and rows are matched through it regardless of order, so a re-sorted export gives the same result as an unsorted one. If no column is unique, matching falls back to row position, and re-sorting will then look like widespread change.
What if the two files have different columns?
Columns are matched by header name, so an added or removed column is reported as such rather than shifting every field one place to the left. Reordered columns are handled the same way. When headers differ entirely between the files, comparison uses column position and you will see that reflected in the report.
Are semicolon files and unusual encodings supported?
The delimiter is detected automatically from comma, semicolon, tab and pipe, so exports from spreadsheet software in comma-decimal locales work untouched. A UTF-8 byte order mark is stripped rather than becoming part of the first column name. Files saved in legacy single-byte encodings should be converted to UTF-8 first.
How many rows can it take?
Comparison recomputes as you type up to about 1 MB combined; larger inputs wait for an explicit Compare so typing stays smooth. Roughly 10 MB a side β a few hundred thousand rows of ordinary width β runs comfortably, with 50 MB as the hard limit.
Is the file read by a server at any point?
It is not. Choosing a file hands it to the browser's File API, which reads it from disk into memory locally; nothing about that involves a network request. No account exists, no history is written, and closing the tab discards everything. The steps for verifying this in DevTools are on the privacy page.
Related tools
- Excel CompareWorkbook comparison across sheets, for .xlsx rather than plain text tables.
- JSON DiffWhen the same records arrive nested instead of flat, compared by path.
- XML DiffRecord batches in tag form, matched by element with attributes normalized.
- Text CompareRaw two-pane comparison when the file is not really tabular at all.