Skip to content
100% local

CSV merger

Stack several CSV tables into one, reconciling different or reordered columns.

Input
Output

CSV merger

Paste two or more CSV tables one after another and this tool stacks them into a single table, even when the exports disagree about which columns exist or what order they come in. It is the fix for three monthly reports where one gained a column, for a survey split across regional sheets, and for the pile of per-team exports that has to become one list before anything can be sorted or counted.

Tables are separated by a blank line by default, or by a marker line of your choosing if your data already contains blank rows. The first line of each block is its header. Columns to keep decides whether the result carries every column seen anywhere, padding the tables that lack one, or only the columns present in all of them. Match header names ignoring case and spaces makes "First Name", "firstname" and "FIRST NAME" the same column, which is what usually separates two exports of the same data. Fill missing cells with writes a marker such as n/a instead of leaving a gap. Add a source table column appends the 1-based number of the table each row came from, so you can trace a row back afterwards. Remove duplicate rows compares the merged cells and keeps the first occurrence, ignoring the source number so the same row from two files still counts as one. Column order follows the first table or sorts alphabetically.

Input and output delimiters are set separately, so you can read semicolon exports and write tab-separated output. Windows and Unix line endings both work.

Everything runs locally in your browser. Your tables are never uploaded, so customer lists and financial exports are safe here. Copy the result, download it as a .txt file, or send it straight to another tool.

FAQ

How do I tell it where one table ends and the next begins?
By default a blank line separates them, so pasting one table, an empty line, then the next is enough. If your data already has blank rows, type a marker such as --- into "Separator between input tables" and put that line between the tables instead.
What happens when the tables have different columns?
With "All columns from every table" the result keeps every column that appears anywhere, and rows from a table that lacked one get the fill value. With "Only columns shared by all tables" the result is trimmed to the columns every table has, and anything else is dropped.
Does the column order in each table matter?
No. Columns are matched by name, not by position, so a table with the same columns in a different order is realigned automatically. Header names are compared ignoring case and spaces unless you turn that option off.
How does duplicate removal treat the source column?
It ignores it. Duplicates are compared on the data cells only and the first occurrence is kept, so the same row appearing in two files is merged into one rather than being kept twice under different source numbers.
Are my CSV tables uploaded anywhere?
No. Merging runs entirely in your browser — your data never leaves your device.