Merge CSV files
The safe way to join exports that no longer match.
Drop files here
or click to choose from your deviceAccepted: CSV, TSV, TXT
Up to 3 files per runUp to 20 MB per file5 runs per dayRemove limits with Pro✓ Works offline
Your files stay on your device
This tool runs entirely in your browser. Nothing is uploaded, nothing is stored, and you can even turn off your internet connection before you start.
Example
Example: three months of shop order exports, one with a new column
For the first-quarter accounts, a small online shop exports orders-jan.csv, orders-feb.csv and orders-mar.csv. In March the shop platform added a Discount code column, third from the left, and February’s file starts with a byte-order mark. Settings: header on, source column Yes — the file name, output Commas, byte-order mark on, name orders-q1.csv.
- Columns are matched by name: Order, Date, Customer and Total from all three files land under the same headings, although in March Customer and Total sit one place further right.
- Discount code exists only in March, so it is added at the end and left blank for the January and February rows.
- February’s invisible byte-order mark is stripped on the way in, so its Order column matches the others.
| Order | Date | Customer | Total | Discount code | source file |
|---|---|---|---|---|---|
| 1041 | 2026-01-04 | R. Patel | 24.50 | orders-jan.csv | |
| 1045 | 2026-02-19 | R. Patel | 24.50 | orders-feb.csv | |
| 1046 | 2026-03-02 | K. Murphy | 36.90 | SPRING10 | orders-mar.csv |
| 1047 | 2026-03-15 | J. Owen | 55.00 | orders-mar.csv |
orders-q1.csv holds all 8 orders under one header, with the note “8 rows from 3 files. Columns matched by name; 1 appeared only in later files and are blank where a file had no value.” Joined end to end instead, March’s discount codes would have sat under Customer and the names under Total.
How it works
- Add two or more CSV files. Commas, semicolons and tabs are all read; you do not have to say which.
- Leave the header switch on unless the files genuinely have no header row.
- Turn on the source column if you will need to know later where a row came from.
- Merge and download.
Frequently asked questions
- Why not just concatenate them?
- Because that is how you get a file that looks right and is wrong. Two exports of the same report a month apart often have a column added or moved; joined by position, every value after that point lands under the wrong heading and nothing complains. Here the columns are matched by name, and the union of all the headers becomes the output.
- What if one file has a column the others do not?
- It becomes a column in the output and the rows from the other files are blank in it, rather than shifted. The note afterwards tells you how many columns that happened to, so a surprise is visible.
- Can I mix a semicolon file with a comma one?
- Yes. The separator is worked out per file by counting them outside quotes, so an export from a German Excel and one from a script join without anything being said. You choose the separator for the output separately.
- My first column is called id and will not match.
- That is a byte-order mark, invisible and attached to the first header. It is stripped on the way in, so the column matches the same one in a file without it — which is the whole reason that particular join usually fails.
- Why offer to add a byte-order mark on the way out?
- Because Excel on Windows reads a UTF-8 CSV as the local codepage unless one is there, which is what turns accented names into mojibake. If the file is for Excel, turn it on; if it is for a script, leave it off.
- In what order do the rows come out?
- File by file, in the order you added them, and within each file as they were; nothing is sorted or de-duplicated. The columns follow the first file, and any column only a later file has is added at the end.
- What are the free limits?
- Three files per run, 20 MB per file and 5 runs a day. Pro removes all three.