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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Cell by cell3 of 4 rows flagged
ABC
21001Acme10
31005Delta50
41002Brill25
51003Corvo30
By key (Calamo)1 added, 1 changed
idnameprice
1001Acme10
+1005Delta50
~1002Brill20 25
1003Corvo30

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 fileNew fileCalamo
1001, 10021002, 1001No change. Row order does not matter.
id,name,pricenote,price,id,nameMatched by name. note is only in the new file, so it is listed and skipped.
key 00123key 123Two different IDs: one removed, one added. Leading zeros are kept.
key 1003 twicekey 1003Flagged as a duplicate key. The first row is compared, the rest are listed with their row numbers.
store 1, sku B, qty 3store 1, sku B, qty 4Changed qty. Pick two key columns when one is not unique.
name = Deltaname = DELTA, column ignoredNo change. Ignored columns are not compared.
"Brill ""Brill"No change. Leading and trailing spaces are ignored.
19.90, 1,519.9, 1.5No change. Same number in a different format.
1,0001Changed. 1,000 can be a thousand or one, so Calamo shows it rather than guess.
DeltaDELTAChanged. Letter case counts unless you switch it off.

What you get at the end

Changed cellsAdded rowsRemoved rows
customer_idcolumnbefore (A)after (B)
C00053planbasicpro
C00053mrr1949
C00106planbasicpro
C00211cityPragueBratislava
C00212planbasicpro
Every changed cell next to its old value. The table scrolls through all of them, 35,505 on the big sample.
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,,,
One CSV with every difference, for Excel, a ticket or an audit trail. Or download added, removed and changed rows separately.
Compare two files Read the guides