CSV Join

Join two CSVs on a key column, SQL-style — inner, left, right, or full outer. Match on values even when the key columns are named differently. Runs entirely in your browser, no upload.

Try:
Joined CSV

About this tool

CSV Join merges two CSV files into one by matching rows on a key column — the same idea as a SQL JOIN or a spreadsheet VLOOKUP, but on whole tables at once. Paste your left and right CSVs, name the key column on each side, pick a join type, and get a single combined table back.

Four join types cover the usual cases:

The key is matched on values, not column names, so the two key columns can be named differently (user_id on the left, uid on the right). Reference a key by its header name or by 1-based position. The output keeps the full left header, then appends every non-key column from the right file; if a right column name collides with a left one it gets a _right suffix so nothing is silently overwritten.

Everything runs locally in your browser — your data is never uploaded.

FAQ

What if the two files use different names for the key column?

That's fine — the join matches on the values in the key columns, not their names. Set the left key (e.g. user_id) and the right key (e.g. uid) independently. Leave the right key blank to reuse the left key's name or index.

What's the difference between inner, left, right, and outer joins?

Inner keeps only keys present in both files. Left keeps all left rows (blank right cells when unmatched), right keeps all right rows, and outer keeps every row from both sides, padding the missing side with blanks. Inner is the default.

What happens when both files have a column with the same name?

The output keeps the full left header first, then appends the right file's non-key columns. If a right column's name already exists in the output, it's suffixed with _right (e.g. name and name_right) so both values are preserved.

What if a key value appears more than once?

Duplicate keys produce a Cartesian product for that key — one output row per matching left×right pair — exactly like a SQL join. Two left rows and three right rows sharing a key yield six joined rows.

Can I join on a column by position instead of by name?

Yes. Enter a 1-based column index (e.g. 1 for the first column) instead of a header name for either key. This is handy when your headers are awkward or absent.

Does the delimiter have to be a comma?

No. Set the delimiter to ,, tab, ;/semicolon, |/pipe, or any single character. The same delimiter is used to parse both inputs and to write the result.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool csv-join "id,name
1,Alice
2,Bob
3,Carol" 'right=id,city
2,Berlin
3,Cairo
4,Delhi' 'left_key=id'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/csv-join/?left=id%2Cname%0A1%2CAlice%0A2%2CBob%0A3%2CCarol&right=id%2Ccity%0A2%2CBerlin%0A3%2CCairo%0A4%2CDelhi&left_key=id&right_key=id&join_type=inner&delimiter=%2C&case_sensitive=true

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.