Compare Two CSV Files

Drop two CSV files and see exactly what changed, cell by cell - added rows, removed rows, and edited values, all highlighted. Pick a unique column and reordered rows still match up correctly. Nothing is uploaded.

Compare Two CSV Files

Drop your CSV files here

Up to 20MB per file. Stays on this device.

Nothing is sent anywhere. Turn off your Wi-Fi and this page still works - try it.

How it works

  1. Choose or drop exactly two .csv files together - the first becomes “File A” (the original), the second “File B” (the changed version). Use the “Swap A ↔ B” button if you picked them in the wrong order.
  2. If a column has a unique value in every row (an ID, an email, an order number), it’s auto-detected as the match key, so rows still line up correctly even if their order changed between the two files. Override it under “Match rows by” if the wrong one was picked, or force plain row-position comparison.
  3. Review the highlighted table: added rows, removed rows, and changed rows (with the specific old → new cell values shown). Then download a status-tagged CSV of the full comparison.
Example output
Statusidnameplanseats
Unchanged1001NorthwindTeam12
Unchanged1005Adventure WorksTeam7
Changed1002ContosoTeamBusiness49
Added1004TailspinFree2
Removed1003FabrikamFree1

Two 4-row files compared by the id column. Rows that moved still match.

Frequently asked questions

What happens if the rows are in a different order in each file?

If any column has a unique value in every row of both files (an ID column is the common case), it’s auto-detected and used to match rows by VALUE instead of position - so a row that moved is still recognized as the same row, not reported as removed-and-re-added. Without a unique column, rows are compared by position using the same alignment algorithm behind line-by-line text diffs: it correctly finds the longest run of untouched rows and reports only what actually changed around them, but a fully shuffled set of otherwise-identical rows (with no unique column) will show as removed and re-added, the same limitation ordinary text diff tools have.

How does it tell a "changed" row from a "removed" row plus an "added" row?

With a key column, this is exact: the same key means the same row, so any cell difference between the two is a "changed" row. Without a key column (comparing by position), a deleted row directly next to an inserted row is reported as one "changed" row only if enough of its cells still match - otherwise they’re unrelated content that happened to land next to each other, and showing them as separate removed/added rows is the more honest read.

Is my data sent anywhere?

No. Both files are read and compared entirely on your device. Turn off your Wi-Fi after the page loads and it still works. This page loads 18KB of JavaScript, gzipped - about what your browser's network tab will show for this page's own scripts.

Is there a size limit?

Each file is capped at a generous size (shown on the drop zone) so a single huge file can’t freeze the tab. Separately, comparing by row position uses an algorithm whose work grows with both files’ row counts multiplied together, so extremely large files (roughly two files each in the low thousands of rows or more) may be refused for position-based comparison with a message pointing you at the key-column option instead - matching by a unique column has no such limit.

What’s in the downloaded diff.csv?

Every row from the comparison (unchanged rows included, regardless of the on-page "show unchanged rows" toggle) with a "Status" column (Unchanged/Changed/Added/Removed) and, for any cell that changed, both values shown as "old → new" in that cell.

How are quoted fields with commas or embedded line breaks handled?

Correctly - this tool reads both files with a full CSV parser, so a quoted field like "Smith, John", or one containing its own line break, is read as one field, not split apart.

Is the comparison case-sensitive and whitespace-sensitive by default?

Case-sensitive by default ("Rent" and "rent" count as different) and whitespace-sensitive by default (a leading/trailing space counts as a change) - both are toggles above the table if you want the comparison to ignore either.

What does Compare-CSV Pro add?

A one-time $3 unlock (no subscription) for two things: batch mode, comparing many file pairs in one pass instead of one at a time, and a combined Excel report - one workbook, one sheet per pair, with changed/added/removed rows highlighted. Everything above stays free and unaffected either way.

Compare Two CSV Files Pro

Files are processed locally in your browser and never uploaded. Read more on the privacy page.