Compare two CSVs and see added, removed and changed rows with cell-level highlighting.
About this tool
CSV Diff is a free, in-browser tool that compares two CSV files and highlights exactly what changed between them. Match rows by a key column (a header name or a zero-based index) so moved rows are still recognised, or leave the key blank to compare row-by-row in positional order. Added, removed and changed rows are colour-coded, and inside a changed row each differing cell is highlighted with the old value struck through next to the new one.
Everything runs locally in your browser using JavaScript — the two files never leave your device, are never uploaded, and nothing is stored, which makes it safe for confidential exports, database dumps or financial data. The delimiter, header handling and an option to show unchanged rows all update the comparison live as you type or paste.
Frequently asked questions
How does key matching differ from positional mode?
With a key column, each row is matched by that column's value, so a row that moved up or down is still detected as the same record and only real cell changes show. Leave the key blank for positional mode, which lines up the two files row 1 vs row 1, row 2 vs row 2, and so on.
What do the colours and the old → new cells mean?
Green rows were added in the new file, red rows were removed, and amber rows changed. Inside a changed row only the cells that differ are shaded, showing the old value with a strike-through followed by the new value.
What CSV conventions are assumed?
Fields are separated by the chosen delimiter (comma, semicolon, tab or pipe), values may be wrapped in double quotes, and an embedded quote is written as two double quotes. When 'first row is a header' is on, the header comes from the new file and is used to resolve key column names.
How are duplicate key values handled?
If the same key appears more than once, the first occurrence in each file is used for matching and later duplicates are ignored, so give each row a unique key for an exact comparison. Very large inputs over about 3 MB per side are rejected to keep the browser responsive.