csvkit.org
CSV (Comma-Separated Values) utilities, in the browser
Say hi →

Merge CSV Files

updated 12 March 2026

merge mode
Drop .csv files here
ready

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:

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

  1. 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.
  2. Pick Concatenate rows or Outer-join on key.
  3. For outer-join, type the exact column name in Join key. It's case-sensitive.
  4. Click Merge. The combined CSV appears on the right; the status bar shows the row and column count.
  5. Click Download .csv to save, or copy the output.
  6. 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

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.