How to standardise column names across multiple csv exports
- Step 1Define the canonical schema once — Agree the exact field names every file will use: for example
sku,quantity,price_gbp,supplier. Write them down (and the case). This is the single target every source file's headers will be renamed to. Consistency here is what makes the later merge clean. - Step 2Open the first source export in the tool — Drop one supplier or partner CSV onto the tool above (it reads
.csv,.tsv,.txt; PapaParse auto-detects the delimiter). The tool lists that file's headers with a rename box each. The header is the only row read to build the list. - Step 3Rename its headers to the canonical schema — For this file, map
Qty→quantity,Item Code→sku,RRP→price_gbp,Vendor→supplier. Leave a box blank if a header already matches the schema. The renamed-count confirms the scope. - Step 4Download the standardised file, then repeat for each source — Click Download to save
<name>.renamed.csv. Then Reset and drop the next supplier file. The mapping differs per file (each supplier's quirks are different), so go through them one at a time — the tool processes a single file per pass. - Step 5Confirm every file now shares the schema — Open two of the standardised files and check the header rows are identical canonical names. A column-name-aware merge needs the names to match exactly (case included); order can differ if your merge aligns by name.
- Step 6Merge the standardised files into one dataset — Feed all the renamed files into csv-merger. With matching headers, identical fields stack under one column instead of splitting. If a merged column is still split, a header in one file didn't match the schema exactly — re-check that file.
Field aliases to canonical names
Common ways suppliers/partners name the same field, and the single canonical name to rename them all to. Pick the case and spelling once and apply it to every file.
| Seen across exports | Canonical name | Why it splits a merge |
|---|---|---|
Qty, Quantity, Units, stock_count | quantity | Four different strings → four columns in a name-aware merge |
SKU, Item Code, Product Ref, sku_id | sku | The join key splits — rows won't align without one name |
Price, Unit Price, RRP, price_gbp | price_gbp | Pricing scattered across columns |
Vendor, Supplier Name, Manufacturer | supplier | Source attribution fragments |
Desc, Description, Product Name | description | Free-text label split |
Qty (trailing space), Quantity | quantity | A trailing space makes two visually identical headers differ |
Standardise-then-merge: which tool does what
This tool standardises one file's headers per pass. The merge and any value cleanup are separate steps.
| Step | Tool | Per file or all at once? |
|---|---|---|
| Rename each file's headers to the schema | csv-header-rename (this tool) | One file per pass |
| Stack the standardised files into one | csv-merger | Multiple files together |
| Trim stray whitespace in values | csv-whitespace-trimmer | Per file |
| Normalise the case of header text or values | csv-case-converter | Per file |
| Drop columns not in the schema | csv-column-remover | Per file |
Cookbook
Per-supplier header rows mapped to one canonical schema. Data rows shown to prove values pass through; the payoff is a clean merge.
Three suppliers, one schema
ExampleEach supplier names quantity and SKU differently. Standardise each file to sku, quantity, price_gbp so the merge stacks them. Renames differ per file.
Supplier A header -> renames: Item Code -> sku, Qty -> quantity, RRP -> price_gbp Supplier B header -> renames: Product Ref -> sku, Units -> quantity, Price -> price_gbp Supplier C header -> renames: sku_id -> sku, stock_count -> quantity, price_gbp -> (blank) All three now share: sku,quantity,price_gbp → csv-merger stacks them into one 3-column dataset.
Before vs after on one supplier file
ExampleA single supplier export, standardised. Only the header changes; the stock figures and prices are identical.
Input header: Item Code,Qty,RRP,Vendor SKU-100,48,12.50,Northwind Renames typed: Item Code -> sku Qty -> quantity RRP -> price_gbp Vendor -> supplier Output header: sku,quantity,price_gbp,supplier SKU-100,48,12.50,Northwind
A trailing space made two headers 'different'
ExampleOne file had Qty with a trailing space; the merge saw it as distinct from Quantity. Typing the clean canonical name into the box overwrites the header entirely, space and all.
Input header (note the space after Qty): 'Qty ',Price 48,12.50 Rename typed: 'Qty ' -> quantity (clean name overwrites the spaced one) Price -> price_gbp Output header: quantity,price_gbp 48,12.50 → Now matches every other file's 'quantity' exactly.
Leave already-canonical headers blank
ExampleSupplier C's file mostly matches the schema. Only relabel the two that differ; the renamed-count confirms it.
Input header: sku,stock_count,price_gbp,supplier Renames typed (sku, price_gbp, supplier left blank): stock_count -> quantity Output header: sku,quantity,price_gbp,supplier → Headers renamed: 1
Two columns share 'Code' in one partner file
ExampleA partner file uses Code twice (product code and warehouse code). Rename by position so each maps to a distinct canonical field.
Input header: Code,Code,Qty SKU-100,WH-3,48 Renames typed (by position): column 1 Code -> sku column 2 Code -> warehouse Qty -> quantity Output header: sku,warehouse,quantity SKU-100,WH-3,48
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
One file's header doesn't match the schema exactly
Merge splits the columnA column-name-aware merge in csv-merger lines up fields by exact header string. If one standardised file says Quantity and the rest say quantity, the merge produces two columns. Re-open the odd file and rename its header to the exact canonical spelling and case. Standardisation only works if every file is identical.
Trailing space or NBSP hidden in a header
Looks identical, isn'tquantity and quantity (trailing space), or a non-breaking space, are different strings to a merge even though they look the same. The tool trims leading/trailing spaces in the displayed list, but to be safe, type the clean canonical name into the box — it overwrites the header entirely, removing any hidden whitespace.
Expecting to standardise several files in one pass
One file per passThis tool processes a single file at a time — drop, rename, download, reset, repeat. There's no batch-rename-many-files mode here. The multi-file step is the merge: standardise each file individually, then combine them with csv-merger.
Two source columns should map to the same canonical name
Duplicate columnsIf a single file has two columns that both belong under quantity (say a case pack and a unit count), renaming both to quantity creates duplicate headers, which merges and re-imports handle badly. Keep them distinct (quantity_units, quantity_cases) and reconcile in your pipeline, or merge them first with a column-merger before standardising.
Case differs across files (Quantity vs quantity)
Case-sensitive merge splitsIf your merge matches headers case-sensitively, Quantity and quantity won't align. Pick one case in the canonical schema and rename every file to it exactly. To normalise an existing batch's header case in bulk you can also use csv-case-converter, but agreeing the case up front is cleaner.
Files use different delimiters
SupportedPapaParse auto-detects the delimiter per file, so one supplier's semicolon CSV and another's tab-separated export both parse and list their columns. Every download is comma-delimited CSV, so after standardising, all your files share both schema and delimiter — ideal input for the merger.
Column order differs between standardised files
Fine for a name-aware mergeOnce headers match by name, the column order between files doesn't matter for a name-aware merge — it aligns fields by header, not position. If your merge is positional, reorder each file with csv-column-reorder first. Renaming alone doesn't change order.
A large catalogue feed exceeds the free limit
Pro overlayA single supplier's full catalogue can pass 500 rows or 2 MB, showing the Pro overlay (the row check runs on the result). Pro raises the limits to 100 MB / 100,000 rows. Standardise small feeds on free; upgrade for big ones, or validate the mapping on a sample before processing the full file.
Frequently asked questions
Can I process multiple files at once?
No — header rename works on one file at a time. For each source export, drop it, rename its headers to the canonical schema, download, then reset and load the next. The multi-file step is the merge: once every file shares the schema, combine them with csv-merger. Each file's rename mapping is different, so per-file is the natural workflow anyway.
Why do my merged files have duplicate columns like Qty and Quantity?
Because a column-name-aware merge treats different header strings as different fields. Qty, Quantity, and Units become three columns. Standardise each file's headers to one canonical name (quantity) with this tool before merging, and they'll stack into a single column. Even a trailing space (quantity vs quantity) will split them, so type the clean name to overwrite any hidden whitespace.
What if two columns in the same file should have the same canonical name?
Avoid giving them identical names — duplicate headers break most merges and re-imports. If two columns genuinely represent the same field (a case pack and a unit count, say), keep them distinct (quantity_units, quantity_cases) or combine them with a column-merger first, then standardise. The tool renames by position and won't stop you creating duplicates, so it's on you to keep names unique.
Does the case of the canonical name matter?
It can. If your merge matches headers case-sensitively, Quantity and quantity won't align. Agree one case in the schema and rename every file to it exactly — the tool writes whatever case you type. To normalise an existing batch's header case in bulk, csv-case-converter can help, but settling the case up front is cleaner.
Is there a way to automate this for many files?
Yes. GET /api/v1/tools/csv-header-rename returns the option schema (a renames map keyed by column index). Pair the @jadapps/runner once and POST each file to 127.0.0.1:9789/v1/tools/csv-header-rename/run with that file's mapping. The runner executes locally, so a script can standardise a folder of supplier feeds before merging — data never leaves your machine.
Does renaming change my stock numbers or prices?
No. The tool rewrites only the header row; every data cell — SKUs, quantities, prices — passes through byte-for-byte. The result panel shows a Data rows count so you can confirm no rows were dropped. Standardisation changes labels, never the values, so the merged dataset's figures match the sources exactly.
Two files have the columns in a different order — is that a problem?
Not for a name-aware merge. Once the headers match by name, csv-merger aligns fields by header rather than position, so column order between files doesn't matter. If your merge is positional, reorder each file with csv-column-reorder first — header rename doesn't change order.
What file types and delimiters does it accept?
It accepts .csv, .tsv, and .txt, and PapaParse auto-detects the delimiter per file (comma, tab, semicolon). So a mix of supplier formats all parse correctly. Every download is written as a comma-delimited CSV, so after standardising, your whole batch shares one delimiter as well as one schema — clean input for the merger.
After merging, one field is still split into two columns — why?
One of the standardised files didn't match the canonical name exactly. Usual culprits: a different case (Quantity vs quantity), or a hidden trailing/non-breaking space. Re-open that file in this tool and type the exact canonical name into the box — it overwrites the header completely, removing stray whitespace — then re-merge.
Is there a row or size limit per file?
Free handles up to 2 MB and 500 data rows per file; a large catalogue feed can exceed that and show the Pro overlay (the row check runs on the renamed result). Pro raises the limits to 100 MB and 100,000 rows. Small per-supplier feeds usually fit free; big consolidated feeds need Pro.
Is supplier/partner data uploaded anywhere?
No. PapaParse runs entirely in your browser; supplier pricing, SKUs, and partner data never reach a JAD server. Only a usage counter (no content) is recorded when signed in, and you can opt out in account settings. Standardisation keeps commercially sensitive feeds on your machine.
Should I also drop columns that aren't in my schema?
Often yes — a clean merge is easiest when every file has only the canonical columns. Leave non-schema headers blank during rename, then drop them with csv-column-remover per file before merging. Or keep them if your merge tolerates extra columns; just be aware they'll appear in the merged output.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.