Join two CSV files and see the row count before it happens

The join plan counts matched keys, duplicate keys on each side, unmatched rows and the exact output size. If a key is duplicated on both sides, the join stops and asks first.

Example data — not saved

Showing synthetic sample data: Join orders to products. Open or drop your own file to replace it — files are read in your browser and never uploaded.

Source AUpdating…
Loading…

Arrow keys move; Enter or double-click edits a cell (recorded as a replayable “Cell edits” step). ∅ = missing, · = edge whitespace, ↵ = line break inside a value. Row labels show source:record provenance.

The example is blocked on purpose

orders.csv references product P-104 twice, and products.csv lists P-104 twice (a current and an old price). Joining them would multiply rows, so the step fails with a many-to-many warning. Open the step to see the cardinality preview, then either deduplicate the product list first or tick “Allow many-to-many expansion”.

Order O-5 points at a product that does not exist. In a left join it stays with missing product columns, and the plan counts it as unmatched rather than dropping it.

Key handling

Keys can ignore surrounding whitespace and letter case. Missing or empty keys never match anything, and they are counted separately. There is no implicit cross join: if no key is chosen, the step refuses to run. The produced row count is checked against the plan before the result is accepted.

Questions

What is a many-to-many join?

When the same key appears more than once on both sides, every left row pairs with every right row for that key. Three by three gives nine rows. It is sometimes intended, often a data problem, so CSVUtils asks.

Which join type should I use?

Inner keeps only matches. Left keeps every row of the recipe table. Right keeps every row of the other file. Full keeps everything from both sides, with missing values where there is no partner.

Are numbers compared as numbers?

Keys are compared as exact text after the normalizations you choose, so 007 and 7 do not match. Convert the key column first if you need numeric equality.