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.
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:
- Inner — keep only rows whose key appears in both files.
- Left — keep every left row; fill blank cells where the right file has no match.
- Right — keep every right row; fill blanks on the left side.
- Outer (full outer) — keep every row from both files, blanks where a side is missing.
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=trueMachine-readable descriptor: tool.json — title + parameters JSON Schema for agents.
