Stack many files into one
Drop in as many files as you have and they are stacked into a single table, matched up by column name rather than by position. Every file gets its own line in the report saying what happened to its columns: aligned, blank-filled, or dropped. Add a _source column and every row remembers which file it came from.
Twelve monthly exports and no two of them the same
Appending files is arithmetic until the schemas disagree, and they always disagree. Someone added a column in March. The export tool renamed Order ID to order_id in a release nobody read the notes for. Q3 has a channel column that Q1 and Q2 do not. One quarter's file came out of a different system entirely and calls the same thing something else.
The dangerous part is that every one of those produces a file that opens perfectly well. cat *.csv > all.csv gives you a file with twelve header rows in the middle of the data and columns silently shifted wherever the order differed. A tool that stacks by position gives you December's amounts in January's date column. Neither of them says a word.
So this page matches columns by name, never by position, and then tells you what it had to do to make the files fit. Not one summary sentence for the whole batch: a line per file.
Worked example: three quarters that do not line up
Click Try with sample data and three files load. They are built to disagree in the two ways real exports do. sales-q1.csv:
order_id,order_date,region,amount
Q1-001,2024-01-14,East,120.50
Q1-002,2024-02-03,West,88.00
Q1-003,2024-03-22,North,240.00sales-q2.csv has gained a column:
order_id,order_date,region,amount,channel
Q2-001,2024-04-08,East,310.20,online
Q2-002,2024-05-19,South,64.00,retail
Q2-003,2024-06-27,West,199.99,onlinesales-q3.csv has lost one and gained a different one:
order_id,order_date,amount,rep
Q3-001,2024-07-11,45.10,ren
Q3-002,2024-08-05,132.40,sam
Q3-003,2024-09-30,76.25,renThe report reads:
sales-q1.csv: 3 rows · blank-filled: channel, rep
sales-q2.csv: 3 rows · blank-filled: rep
sales-q3.csv: 3 rows · blank-filled: region, channelNine rows out, six columns plus _source. Every gap is visible, and nothing was dropped. Switch Columns to Only shared columns and you get four columns instead, with the report now naming channel and rep and region as dropped, which is the honest version of that trade.
The two column modes, and when each is right
- Keep every column is the default. The output has the union of every column any file had, and a file that was missing one gets blanks there. Nothing is lost, and the shape of what was missing is visible in the data itself. This is what you want for anything you are going to analyze, because a blank is information and a dropped column is not.
- Only shared columns keeps the intersection: columns present in every single file. The output is narrower and completely dense, with no blanks introduced by the append. This is what you want when the destination is a database table with a fixed schema, or when the extra columns really are noise from one system.
The trap in the second mode is that one badly-named column in one file can quietly shrink the whole result. If eleven files have order_id and the twelfth has Order ID, the intersection loses the id column entirely. The report is what catches this: you will see the same column named as dropped from eleven files at once, which is not a pattern that happens by accident.
Header normalization, which is the fix for most of it
Turn Header names to Normalize first and every column name in every file is rewritten to snake_case before the matching happens. Order ID, order_id, Order Id and ORDER ID all become order_id and collapse into one column.
This is off by default, deliberately. It is a change to your data, and a tool should not rewrite your column names without being asked. But it is the single most effective thing on this page: on a real set of quarterly exports it routinely turns a union of nineteen columns back into the eleven the person was expecting, and the difference between those two numbers is entirely casing and spacing.
The rewrite applies to a copy, so turning the toggle back off restores the original names exactly rather than a lower-cased approximation of them. What it cannot do is match two columns that are genuinely named different things: amount and total_value stay separate, and they should, because deciding those are the same thing is a judgment about your data that no tool should make on its own.
The _source column, and why it is on by default
Every row gets a column naming the file it came from. It is the first thing on this page that you will not appreciate until the moment you need it, which is why it defaults to on rather than being an option you would have had to know about in advance.
The moment is this: the combined file has a number in it that is wrong, or a duplicate that should not exist, or three thousand rows more than the sum of what you thought you loaded. Without _source you are opening twelve files to find out which one. With it, you filter one column.
It is also the thing that makes the appended file useful as data rather than just as a pile. Group by _source and you have a per-file row count, which is the fastest possible check that every export actually made it in. Cross-tabulate _source against a category column and you can see which file introduced a value none of the others have. Both of those are one click away on the group-by page and the crosstab page.
Details worth knowing
- Row order is file order. Files stack in the order they appear in the list, and rows keep their order within each file. Nothing is sorted or shuffled. Remove a file with the × on its chip and the rest close up.
- A workbook contributes every sheet that has data. Drop one Excel file with four populated sheets and you get four sources, labeled with the sheet name. That is usually exactly what someone means by "combine my workbook".
- Values are moved as text. Leading zeros survive,
120.50keeps its trailing zero, and a long numeric id does not turn into scientific notation. Nothing is retyped on the way through. - Formats can mix. CSV, TSV, TXT, Excel, JSON and JSON Lines in the same batch. A JSON array of objects becomes a table with one column per key, and keys that only some objects have become columns that only some rows fill in, which the report then reconciles like any other schema difference.
- Duplicates are not removed. Appending is a stacking operation and it does exactly that. If the same rows appear in two of your files, they appear twice in the output. Run the result through the deduplicate tool afterwards, which keeps the two decisions separate and visible.
Frequently Asked Questions
How many files can I append at once?
There is no fixed limit on the count. The practical ceiling is memory: everything is held in the tab while it works, and the combined result has to fit alongside the inputs. A few dozen files of a few megabytes each is comfortable. If you are combining hundreds of large exports, append them in batches and then append the batches, or use the full editor, which streams.
What happens when the files have different columns?
That is the normal case, and it is what the per-file report is for. In the default mode the output has every column any file had, and files that were missing one get blanks there, with those columns named per file in the report. In the other mode only columns present in every file survive, and the dropped ones are named. Either way you are told, per file, before you download.
Why is my combined file missing a column I know was there?
Almost certainly the column mode is set to Only shared columns and one of your files spells that column differently. Switch to Keep every column to confirm it reappears, then turn on header normalization, which collapses Order ID and order_id into one column and usually fixes it properly.
Does the header row from each file end up in my data?
No. Each file's first row is read as its header and used to work out which column is which. It never becomes a data row. That is the main thing this page does that concatenating files in a terminal does not, and it is why the output has one header line rather than one per file.
Can I append Excel files and CSVs together?
Yes, and JSON and JSON Lines too, in the same batch. Each file is read on its own terms and then reconciled by column name like any other source. An Excel workbook with several populated sheets contributes one source per sheet, labeled with the sheet name, so combining a multi-sheet workbook is the same gesture as combining several files.
Are duplicate rows removed?
No, and deliberately. Appending stacks; deduplicating is a separate decision with its own options about which columns count as identifying. Doing both silently in one step is how a tool loses rows you wanted. Take the appended file to the deduplicate tool, or build both steps into a pipeline so you can see each one's effect on the row count.
Do the files get uploaded anywhere?
No. There is no upload endpoint on this page. The files are read in your tab, stacked in memory, and the result is assembled locally. Nothing persists between visits. You can confirm it by loading the page, turning off your network connection, and appending files anyway.
Related
Combine your exports and see what had to give
Any number of files, matched by column name, with a reconciliation line for every one of them.
Back to the append tool