CSV Joiner

SQL-style join two CSV tables on a key column.

Open tool

Overview

The CSV joiner performs a SQL-style join on two pasted CSV tables using a key column shared between them. Inner, left, right, and full outer joins are supported, so you can merge two datasets — say, users with their order counts, or products with category metadata — without opening Excel or writing Python.

Data analysts, marketers building cohort lists, and developers prepping fixture data reach for a csv join tool when they have two small tables that need to be combined for a one-off report. It avoids the overhead of spinning up Pandas or a database for a job that's over in a few seconds.

How it works

Both tables are parsed per RFC 4180 with the first row as headers. The user picks a key column from each side, and the joiner builds a hash index over the right table keyed by that column. Each left row is looked up in the index; matching pairs emit a combined row with the left columns first, then the right columns minus the duplicated key.

The join type controls what happens when a key has no match. Inner drops unmatched rows on both sides, left keeps all left rows (with right columns blank where no match), right is the mirror, and full outer keeps every row from either side. Many-to-many keys produce the Cartesian product per matching key, exactly like SQL.

Examples

Left (users.csv):
id,name
1,Alice
2,Bob
3,Carol

Right (orders.csv):
user_id,total
1,42
1,17
2,99

Inner join on id = user_id:
id,name,total
1,Alice,42
1,Alice,17
2,Bob,99
Left join on the same input:
id,name,total
1,Alice,42
1,Alice,17
2,Bob,99
3,Carol,

FAQ

Are joins case-sensitive on the key?

Yes by default. Toggle the case-insensitive option if your key column has inconsistent casing (alice@x.com vs Alice@x.com).

What about joining on multiple columns?

Compound keys aren't a built-in option here. Concatenate the columns into a synthetic key in both tables first (first_name||'|'||last_name), then join on that.

How large can the inputs be?

Both tables are held in memory, so anything up to a few hundred thousand rows works comfortably in the browser. Beyond that, drop into duckdb, sqlite, or pandas for streaming joins.

Try CSV Joiner

An unhandled error has occurred. Reload ×