Kit-Bin
Donate

Drop two or more CSV files here or click to browse

Processed entirely in your browser. Never uploaded to a server.

This tool stacks the rows of several CSV files into one file, under a single header row. Select two or more CSVs above, or drop them in together. The merged file downloads once it is ready.

This is a vertical merge, not a join

The rows of every file are appended one after another, in file order. The tool does not match records on a shared key, so if customer 42 appears in two files you get two rows for customer 42 rather than one merged row. That kind of key-based lookup is a join, which needs to know which column is the key and what to do when values conflict, and this tool deliberately does not guess at either.

Columns are unioned, never dropped

Files exported at different times often do not share the same columns. Rather than keeping only the columns every file has in common, the output includes every header found in any file. Where a file did not have a column, its rows get a blank cell there. The summary after the merge reports the file count, total rows, and column count, and it says so explicitly when headers did not match, so you know where the blanks came from.

Before you merge

  • Header matching is exact, so "Email" and "email" become two different columns.
  • Every file needs a header row. The first row of each file is read as its headers.
  • Files must be comma-delimited. A semicolon or tab delimited file parses as one column.
  • Duplicate rows are kept. The merge does not deduplicate anything.
  • Fully blank rows are skipped while reading, so they do not pad the output.

If your files came from different systems, running each one through CSV Cleaner first will trim stray whitespace out of the headers and cut down on accidental duplicate columns.

FAQ

What happens if my files have different columns?
Nothing is dropped. The output has one column for every header seen in any of the files, and a file that lacked a column simply gets a blank cell there. The result summary tells you when the headers did not match, so you know blanks were introduced rather than finding out later.
Does the column order have to match?
No. Columns are matched by header name, not by position. If one file has id, name and another has name, id, the values still land in the right columns.
Is this a join on a key, like a VLOOKUP?
No. This is a vertical merge: it stacks the rows of every file under one header row. If the same id appears in two files, you get two rows, not one combined row. Joining records on a shared key is a different operation and this tool does not do it.
What order do the rows come out in?
File order, then original row order within each file. Rows are not sorted, deduplicated, or reordered. The files are processed in the order your browser hands them over, which for a multi-select is normally the order shown in the file picker.
Does header matching care about case and spaces?
Yes, matching is exact. "Email" and "email" are treated as two separate columns, as are "name" and "name " with a trailing space. If your files came from different exports, check the header spelling first, or clean each file before merging.
How many files can I merge?
At least two, with no fixed upper limit. Everything is held in your browser tab’s memory, so merging a large number of big files can make the tab slow. If it struggles, merge in a few batches and then merge the batches.

Once merged, convert the result with CSV to Excel or CSV to JSON. Merging sheets out of one workbook instead? Start with Excel to CSV, which can export every sheet as its own CSV.

If the merged file gets rejected by whatever you import it into, read why CSV imports fail.

Looking for a key-based join instead of a row stack? Read stacking vs joining CSV files for the difference and what this tool does and doesn't do.