How to compare two CSV files, ignoring row order and timestamps
Exports can change their row order, timestamps and number formatting without changing the underlying records. Use three synthetic examples to find meaningful changes by key, entirely in your browser.
Updated October 7, 2026 · 5 minute read
Why a line diff can be misleading
A text diff compares lines and strings. Reordering can make the same product look removed and added. Match sku + region to compare the same product in the same region. SKU alone is not unique in this example.
The workflow
- Download a before/after pair below and select both files in the browser tool. The home page also has a one-click price example.
- Select the keys, ignored columns and numeric columns specified for that case. Keep absolute tolerance at 0.
- Click Compare snapshots. Check counts and field changes; select All rows to see unchanged records.
- Export the HTML report and open it offline to inspect its settings and results.
1. Review price tables
Download before CSV · Download after CSV
- Keys:
sku + region - Ignore:
updated_at - Numeric:
price - Absolute tolerance:
0
| Added | Removed | Changed | Unchanged |
|---|---|---|---|
| 1 | 1 | 2 | 2 |
The US keyboard changes 79→74 and the EU keyboard 89→94. P-005 (webcam) is added; P-003 (monitor) is removed. P-004 stays unchanged because 9.99 equals 9.990 in numeric mode. An absent row does not prove a product was delisted.
2. Check database exports
Download before CSV · Download after CSV
- Keys:
id - Ignore:
exported_at - Numeric:
balance - Absolute tolerance:
0
| Added | Removed | Changed | Unchanged |
|---|---|---|---|
| 1 | 1 | 1 | 2 |
002 changes status from pending to active; 005 is added and 003 removed. 004 has equivalent numeric values 7 and 7.0. IDs retain leading zeros and are matched as strings. These checks do not establish that a database migration is correct overall.
3. Review configuration changes
Download before CSV · Download after CSV
- Keys:
service + environment - Ignore:
updated_at - Numeric:
timeout_seconds, retries - Absolute tolerance:
0
| Added | Removed | Changed | Unchanged |
|---|---|---|---|
| 1 | 1 | 2 | 1 |
api + production changes timeout from 30 to 45; api + staging changes enabled from true to false. scheduler + production is added and legacy + production removed. Boolean fields use exact strings; this example does not change running services.
If the counts differ
- Check the file pair, composite keys and comma delimiter.
- Without ignoring timestamps, more rows change. Without numeric mode, 9.99 and 9.990 differ.
- Duplicate or empty keys cause an error. Inspect the export rather than arbitrarily removing duplicates.
- Added and removed columns are reported separately; a new column does not automatically modify every row.
Try a familiar export
Start with synthetic or anonymized data. If the result is surprising, describe your keys, settings and expected result on GitHub. If this saves you a manual check, a star is welcome.