How it works
Calamo pairs the rows of the old and the new file by a key column, then compares the paired rows cell by cell, column by column name. Everything happens in your browser tab; the files are never uploaded.
- Read both headers. The delimiter, the encoding and a title above the header are detected. Only columns that both files have are compared; the others are listed.
- Pick the key. A column with a different value in every row, like an ID or an order number. Calamo suggests one and checks that it is unique. Two columns can form the key together.
- Pair the rows. A key only in the old file is a removed row, a key only in the new file an added row. The order of the rows does not matter.
- Compare the cells. For every pair, each shared column is compared with the rules below. Every row of both files is counted once, so the counts always add up.
One inserted row breaks a cell-by-cell compare
The new export has one extra customer near the top and one changed price. Compared cell by cell, as with =A1<>Old!A1 in Excel, every row below the insert looks different. Matched by key, it is one added row and one changed cell.
| A | B | C | |
|---|---|---|---|
| 2 | 1001 | Acme | 10 |
| 3 | 1005 | Delta | 50 |
| 4 | 1002 | Brill | 25 |
| 5 | 1003 | Corvo | 30 |
| id | name | price | |
|---|---|---|---|
| 1001 | Acme | 10 | |
| + | 1005 | Delta | 50 |
| ~ | 1002 | Brill | |
| 1003 | Corvo | 30 |
Excel can match by key too, with XLOOKUP or Power Query: see how to compare two Excel sheets. It just takes a formula per column and stops at 1,048,576 rows.
How it decides what changed
Rows are paired by the key column and cells by column name. You can switch off the spaces, letter case and number rules under “Treat as equal”.
| Old file | New file | Calamo |
|---|---|---|
1001, 1002 | 1002, 1001 | No change. Row order does not matter. |
id,name,price | note,price,id,name | Matched by name. note is only in the new file, so it is listed and skipped. |
key 00123 | key 123 | Two different IDs: one removed, one added. Leading zeros are kept. |
key 1003 twice | key 1003 | Flagged as a duplicate key. The first row is compared, the rest are listed with their row numbers. |
store 1, sku B, qty 3 | store 1, sku B, qty 4 | Changed qty. Pick two key columns when one is not unique. |
name = Delta | name = DELTA, column ignored | No change. Ignored columns are not compared. |
"Brill " | "Brill" | No change. Leading and trailing spaces are ignored. |
19.90, 1,5 | 19.9, 1.5 | No change. Same number in a different format. |
1,000 | 1 | Changed. 1,000 can be a thousand or one, so Calamo shows it rather than guess. |
Delta | DELTA | Changed. Letter case counts unless you switch it off. |
What you get at the end
| customer_id | column | before (A) | after (B) |
|---|---|---|---|
| C00053 | plan | basic | pro |
| C00053 | mrr | 19 | 49 |
| C00106 | plan | basic | pro |
| C00211 | city | Prague | Bratislava |
| C00212 | plan | basic | pro |
calamo-diff-report.csv
status,customer_id,column,value_a,value_b changed,C00053,plan,basic,pro changed,C00053,mrr,19,49 changed,C00106,plan,basic,pro changed,C00211,city,Prague,Bratislava ⋮ added,C5001,,, ⋮ removed,C00097,,,