CSV Diff

Pick a key column and see added, removed, and changed rows — with the changed cells highlighted. Nothing is uploaded.

Both files are parsed and compared entirely in your browser — nothing is uploaded, and nothing is written to the URL.

Matching by a key column finds rows that moved or were reordered. Cells compare as text, so 1.0 and 1 are different values.

Match rows by key, not by position

The reason a text diff is useless on CSV exports is that rows move. Sort the export differently, insert one record near the top, or delete a row in the middle, and a line-based comparison marks everything below as changed. Pick a key column — an id, a SKU, an email address — and this tool matches rows by that value wherever each one sits in the file. A row that moved from line 4 to line 40 is not a change; a row whose price went from 0.50 to 0.55 is, and that is the cell you see highlighted.

If your data has no natural key, switch the selector to (row number) and rows are paired by position instead — deliberately simple, and appropriate when the two files really are meant to line up row for row.

New columns don't make every row "changed"

This is the detail most CSV comparison tools get wrong. When the second file adds a column, every single row technically has a cell it did not have before — so a naïve comparison reports the entire file as modified and the report is worthless. Column additions and removals are reported once, at the top, and cells belonging to those columns never make a row count as changed. A row with identical shared values is unchanged, even if it picked up a new column.

Quoted fields, delimiters, and other CSV realities

The parser follows RFC 4180 properly, which means fields wrapped in quotes can contain commas, doubled quotes ("" for a literal quote), and even embedded newlines without breaking the row structure. Delimiter detection is automatic — comma, semicolon, and tab-separated files all work, which matters because European locales export semicolon-delimited CSV by default — and you can force a specific delimiter if a file's first line fools the guess.

Cells compare as text, exactly as they appear in the file. That means 1.0 and 1 are reported as different, as are 2024-01-05 and 01/05/2024. This is deliberate: a CSV file has no type information, so guessing that two spellings mean the same number would hide genuine formatting changes that often matter more than the values themselves.

Nothing leaves your browser

CSV exports are usually the most sensitive files anyone handles — customer lists, transaction records, payroll. Both files are parsed and compared locally, nothing is uploaded, and nothing is written to the URL.

Related tools: the JSON, YAML, and XML diff tools for structured formats, and the text diff for raw line-by-line comparison.