Why Text Diff Gives the Wrong Answer
A general diff tool compares two files line by line. That is exactly right for source code, where line order carries meaning, and exactly wrong for a CSV export, where it usually does not.
Three things routinely happen between two database dumps, and a text diff mishandles all of them:
- Rows come back in a different order. Change an
ORDER BY, or let the database return rows however it likes, and a line-based diff reports thousands of deletions and thousands of insertions for a file where nothing actually changed. - A column gets inserted in the middle. Every single line now differs, even though one field was added.
- A volatile column moves on every export. An
updated_attimestamp guarantees that every row looks modified.
What you want instead is a diff that identifies each row by a key — usually a primary key column — and then compares the fields of matching rows. That distinction matters far more than raw file size, and it is why the right answer for CSV is rarely the same tool you use for code. Our guide to comparing two texts online covers the line-based case; this article is about the tabular one.
Browser Tools and Their Real Caps
Diffchecker is the default suggestion in most listicles, and its free tier has tightened. Its pricing page now lists the free Basic plan as limited to 5 tries per month for unified view, the real-time editor, hide-whitespace, custom rules, syntax highlighting and PDF export, and 10 tries per month for character-level differences and merging changes. On the Excel and CSV side, formula detection, date normalisation and hiding unchanged rows or columns sit under the same 5-or-10-per-month meters. Basic comparison still works; the features that make a large diff readable are the metered ones. Pro with the desktop app is $15/month, with 29% off annually.
There is a second, quieter problem with browser diffing. These tools load both files into the page to compare them, so the practical ceiling is your browser tab's memory, and none of the vendors publish a supported file size. Diffchecker's pricing page states no per-comparison size limit at any tier — which is not the same as promising a 500 MB file will work. With large exports you tend to discover the limit by watching the tab freeze.
The third consideration is where the data goes. A CSV dump of customer or financial records pasted into a web tool has left your machine. Every tool in the next two sections runs locally.
The Free Tools That Handle Millions of Rows
qsv Fastest, and does far more
qsv is MIT-licensed and free, and its diff command is documented as comparing two CSVs of 1M rows × 9 columns in under 600 ms. The project is built for data at this scale: its README works through a 15 GB, 28-million-row NYC 311 dataset, where building an index takes about 14 seconds and then makes many operations effectively instant. It also ships extsort and extdedup for arbitrarily large files that do not fit in memory.
If you deal with big CSVs regularly, this is the one to install — the diff is one command among dozens covering validation, joins, sorting and deduplication.
csvdiff Purpose-built for DB dumps
MIT-licensed, and explicitly designed for the job this article is about: its own documentation describes it as most suitable for comparing CSV files dumped from database tables, and states it compares CSVs of a million records in under 2 seconds.
It works by hashing rows keyed on the columns you nominate as the primary key, which is what lets it detect modifications even when row order changes and lets you ignore volatile columns such as created_at. Its README is refreshingly honest about the trade-off: GNU diff is orders of magnitude faster, because comparing lines is a much cheaper problem than understanding tables.
csv-diff Readable output, smaller files
Simon Willison's csv-diff is Apache 2.0 and installs with pip. You give it a key column — csv-diff one.csv two.csv --key=id — and it reports changes in human-readable form, handling CSV, TSV and JSON arrays. It is the friendliest output of the three for pasting into a ticket or a commit message.
Its own README points to csvdiff for better results against larger files, which is a useful signal: use csv-diff for clarity on moderate files, and one of the two above when size is the issue.
daff Structural, and embeddable
daff is MIT-licensed and installs from npm, pip, gem, Composer or CRAN. It aligns rows and columns rather than lines, so it copes with reordered rows and inserted or removed columns, and it can both produce a diff summary and apply that summary as a patch. That last part makes it the pick when you want to script a change from one version of a table to another, not just look at it.
DuckDB When you want SQL
Not a diff tool, but often the fastest path for a one-off comparison on a big file. DuckDB reads CSVs directly — SELECT * FROM 'export.csv' — with a sniffer that works out the format, and accepts a glob to read many files at once. From there, an EXCEPT between two tables gives you rows present in one and not the other, and a join on the key column gives you field-level changes with full control over which columns to ignore.
One documented setting worth knowing for messy exports: max_line_size defaults to 2,000,000 bytes, so a pathologically long line needs that raised. If you are already converting between formats, our CSV to JSON converter and JSON Formatter handle the small end of the same workflow in the browser.
Free Desktop Apps
If a graphical side-by-side view matters more than row-key logic, two genuinely free options stand out, both without the browser's memory ceiling.
WinMerge is free and open source for Windows (XP SP3 or newer), currently at version 2.16.58.2, and compares both files and folders with syntax highlighting and regex filters. Meld is GPLv2-or-later, at version 3.24.0 released in June 2026, and does two- and three-way comparison of files and directories on Linux, Windows and — semi-officially, via Homebrew or MacPorts — macOS.
Both are still line-based, so they inherit the reordering problem described above. Sort both files by the key column first and they become far more useful.
Beyond Compare deserves a mention because it is frequently listed as free and is not: Scooter Software grants a 30-day evaluation, after which a licence is required — $35 for Standard, $70 for Pro, as a one-time purchase with no renewal fee. Its table compare feature is genuinely good, and $35 once is a fair price. It is just not a free tool.
Comparison Table
| Tool | Cost & Licence | Key-based? | Scale / Limit |
|---|---|---|---|
| qsv diff | Free, MIT | Yes | 1M rows × 9 cols in <600 ms; 15 GB datasets documented |
| csvdiff | Free, MIT | Yes — primary key | 1M records in <2 s |
| csv-diff | Free, Apache 2.0 | Yes — --key | README suggests csvdiff for larger files |
| daff | Free, MIT | Yes — aligns rows/columns | No published benchmark; also applies patches |
| DuckDB | Free | You write the SQL | Parallel CSV reader; max_line_size 2,000,000 bytes |
| Diffchecker | Free tier; Pro $15/mo | No | Several features metered at 5–10 uses/month; no published size limit |
| WinMerge / Meld | Free, open source | No | Local, no published cap; sort by key first |
| Beyond Compare | 30-day trial, then $35/$70 | Yes — table compare | Not free; one-time purchase |
Which One Should You Use?
- Two big exports from the same table: csvdiff, keyed on the primary key, ignoring the timestamp columns. This is the case it was written for.
- Big CSVs as a regular part of the job: qsv. The fastest diff here, and you get validation, joins and dedup in the same binary.
- You want output you can paste into a ticket: csv-diff, on files of moderate size.
- You need to apply the changes, not just see them: daff, which turns a diff into a patch.
- You think in SQL: DuckDB with
EXCEPTor a keyed join — total control over which columns count. - You want a visual side-by-side and the file fits: WinMerge or Meld, after sorting both files by the key column.
- A one-off comparison of two small files: a browser tool is fine — just watch the monthly meters, and never paste confidential rows into one.
Before diffing, it is worth making sure both files are actually comparable: identical column order, consistent encoding, no stray whitespace. Our guide on cleaning text data online covers that prep, and Remove Duplicate Lines is often the fastest way to rule out duplicates before you go looking for real differences.