Merge CSV Files
CSV Merge Toolkit
Combine multiple CSV files into one, in two modes. Concatenate stacks
rows across files — useful when an export is split across months, shards, or regions.
Outer-join matches records on a shared key column — useful when each
file adds more columns about the same records (for example, users + orders + subscriptions
joined on a common user_id). Processing happens entirely in the browser.
Before you start
You'll need:
- Two or more CSV files, each with a header row. The tool reads headers to figure out columns.
- For Outer-join, a column name that exists in every file and uniquely identifies a record (typically
id,user_id,email, etc.). Leading/trailing whitespace is trimmed on the key; casing is compared as-is.
Files don't have to have the same columns. Concatenate mode builds a column union; outer-join mode does the same for non-key columns.
How to use it
- Drop all your CSV files onto the drop zone (multi-select from the picker also works). The file list on the left shows what's loaded.
- Pick Concatenate rows or Outer-join on key.
- For outer-join, type the exact column name in Join key. It's case-sensitive.
- Click Merge. The combined CSV appears on the right; the status bar shows the row and column count.
- Click Download .csv to save, or copy the output.
- Use Clear files to reset.
Modes explained
Concatenate rows
Stacks all rows from every file on top of each other, preserving file order. The output has the union of all headers seen across the inputs; columns missing from a given file become empty cells in its rows.
When to use it: one export split across months, shards, or regions; daily dumps you're combining into an archive; CSVs from different teams with mostly-aligned schemas.
Outer-join on key column
Treats one column as the record identifier. Rows sharing the same key across files are merged into one output row, column-by-column. Rows whose key cell is empty are skipped (with a count in the status bar). If two files have a non-key column with the same name, later files overwrite earlier values for the same key — watch for this if your "same" column actually has different meanings in different exports.
When to use it: combining users + orders + subscriptions by user_id;
enriching a product list with inventory / pricing / translations; merging survey responses
across question batches by respondent_id.
Example
users.csv:
id,name
1,Alice
2,Bob
orders.csv:
id,total
1,42
3,17
Outer-join on id:
id,name,total
1,Alice,42
2,Bob,
3,,17
Tips & common pitfalls
- Join keys must match exactly.
"42 "(with a trailing space) and"42"are two different keys unless you pre-trim. The tool trims leading/trailing whitespace on keys, but nothing fancier. - Duplicate keys within a file produce one output row per combination; you may end up with more rows than you expect. Dedupe first using Dedupe CSV if that's a problem.
- Pick files in the right order for concatenate. The UI merges in the order files were added. Clear and re-add if you need a specific order.
- Header spelling matters.
email,Email, ande_mailbecome three separate columns in concatenate mode. Normalise headers before merging if your exports are inconsistent. - Huge outer-joins allocate a hash map keyed by the join column; expect the memory footprint to be a few multiples of the raw file size.
Troubleshooting
Outer-join produced zero rows.
The join key probably doesn't match any file's header (check spelling and case), or every row has an empty value in that column. The status bar will say "skipped N rows with empty key" when that happens.
My numeric key lost leading zeros.
CSV doesn't preserve type info, but this tool also doesn't strip zeros. Check whether the source file already lost them (often from an Excel save). Re-export the file as text if that's the case.
"Same" column from different files is clobbering values.
That's by design for outer-join — last file wins for a given key + column. If you need to preserve both, rename the column in each source before merging (e.g. total_jan, total_feb).
Frequently asked questions
How many files can I merge?
No fixed limit. Practically, your browser's memory is the cap. A dozen 50 MB files is routine on a laptop.
What if the files have different headers?
In concatenate mode the output has a union of all headers and missing cells are empty. In outer-join mode, non-key columns from all files are added and filled where the key is present.
Does this inner-join / left-join?
Only outer-join is exposed right now. If you need inner-join, filter the result to rows where every "required" column is non-empty. Happy to add explicit join types if there's demand.
Are my files uploaded?
No — see the privacy policy. Everything happens in your browser.