Home · Free tools · CSV compare

Compare two CSV files

Drop yesterday's export and today's. You get every changed cell, every row that appeared and every row that vanished. Rows are matched by a key column of your choosing — an ID, an email, an order number — so an export that came back in a different order does not read as though every line changed. The delimiter and the character encoding are detected, and neither file is uploaded.

First CSV

Drop .csv, .tsv or .txt here, or click to choose

Second CSV

The newer export you want to check

Nothing is uploaded. The file is read by JavaScript in this tab and never leaves your computer — no server sees it, and closing the tab throws it away.

How to compare two CSV files

  1. Drop both files. The older export on the left, the newer one on the right. Both are parsed in this tab — the delimiter is sniffed and the encoding is detected before anything is compared.
  2. Choose the key column. Pick the column that identifies a row: an ID, an email, an order number. Rows are paired on that value rather than on their line number.
  3. Read the diff. Changed cells show the old value struck through next to the new one. Rows present in only one file are colored and counted separately.
  4. Export the differences. Download just the changes as CSV or XLSX — one row per difference, with the file each value came from.

Why a text diff is the wrong tool for a CSV

Most tools that compare CSV files are text diffs underneath: they line up file A line 1 with file B line 1 and walk down. That is exactly right for source code and quietly wrong for exported data, because two things happen to exports that do not happen to code:

  • The order changes. A report re-run tomorrow can come back sorted differently, or with one row inserted near the top. A line-based diff then reports every following line as changed, and a two-row difference arrives as four thousand.
  • The columns move. Somebody adds a column in the middle and every field shifts one to the right. Character by character, nothing lines up; row by row, almost nothing changed.

Matching by a key column removes both problems. The pairing is on the value in that column, so order is irrelevant, and the comparison is per named column, so an inserted column shows up as one new column rather than as a rewritten file.

Delimiters and encodings, before the comparison starts

A CSV is not one format. The separator may be a comma, a semicolon (normal in locales where the comma is the decimal separator), a tab or a pipe; the file may be UTF-8 with or without a byte order mark, UTF-16, Shift-JIS, Big5, GBK, EUC-KR or Windows-1252. Both are detected per file, so two exports that disagree about either still compare correctly — and a file that arrives as mojibake is decoded rather than diffed as garbage. If you only need that half of the job, the encoding fixer does it on its own.

What counts as a difference

Values are compared as text after trimming, which is what makes a diff of exported data usable: 0012 stays 0012 rather than becoming the number 12, and a trailing space introduced by one system does not turn every row red. Quoting is normalized away — a field quoted in one file and bare in the other is the same value, because the quotes are CSV syntax, not data. Line endings, likewise: a file saved on Windows and the same file saved on a Mac are not different files.

Bigger than the browser likes

Files in the tens of megabytes parse and compare in this tab. Past that, the limit you meet is the memory of the tab rather than the tool. Two ways through: split the file first with the CSV splitter and compare the parts, or drop the pair into the TableDI desktop app, which reads the file off disk instead of into a page.

Nothing leaves this tab

CSV exports are usually the whole customer table, the whole order history, or a payroll run. Both files are read by JavaScript running on your machine and the comparison happens there. There is no request to send, so nothing to intercept, log or retain — watch the Network tab while you drop a file and you will see it.

Questions people ask

How do I compare two CSV files?

Drop both onto this page and pick the column that identifies a row. You get the changed cells, the rows only in the first file and the rows only in the second. No install, no account, and the files stay on your machine.

The two files are sorted differently. Does that break it?

No — that is the reason for the key column. Matching is by the value in that column, not by line number, so a re-sorted export compares correctly. Switch to matching by position only when the files have no identifier and the row order is itself meaningful.

What if the two files use different separators or encodings?

Each file is sniffed on its own, so a semicolon-separated Windows-1252 export compares correctly against a comma-separated UTF-8 one. The detected values are shown so you can see what was assumed.

Can I compare a CSV against an Excel file?

Yes. Both boxes also accept .xlsx and .xlsm, and a workbook's sheet can be picked on either side. If both sides are Excel files, compare two Excel files is the page written for that.

Are my files uploaded anywhere?

No. The file is read by JavaScript running in this tab, using the browser's own DecompressionStream to unzip .xlsx and a parser that runs on your machine. There is no server call in the page — you can watch the network tab while you use it. Close the tab and the data is gone.

Do this on your own machine instead

TableDI is a desktop spreadsheet workspace that runs entirely on your machine. Import the file, fix it, chart it — nothing is uploaded, and there is no account to create.

Free forever, not a trial — no account, no card. macOS today; a Windows build is in progress. What the paid tier adds.

Last reviewed 2026-09-01 by the TableDI team. Something wrong on this page? Tell us — it is one inbox, read by the people who build TableDI.