How to split a sku column into separate attribute columns
- Step 1Export the catalog or inventory as CSV — From your store, ERP, or marketplace, export the CSV containing the SKU column (often
SKU,Variant SKU,Item Code, orStyle). - Step 2Drop the CSV onto the splitter — PapaParse parses it in your browser and lists headers as selectable columns. SKUs and inventory stay local — nothing is uploaded.
- Step 3Select the SKU column — Choose the radio button for the SKU column. It is replaced in place by the attribute columns; price, title, and stock columns keep their position.
- Step 4Set the delimiter to your SKU separator — Enter the character your SKUs use between segments — usually
-, sometimes_or/. It's a literal string split, so type the exact separator. - Step 5Set a prefix and review max parts — Set
New column prefixtoAttrso columns readAttr_1...Attr_n. LeaveMax parts per rowat the default 100 for the first pass so no segment is dropped, then readMax parts seento confirm the widest SKU. - Step 6Run, verify alignment, download — Click Split, check the 10-row preview that each attribute landed in a consistent column, then download
<name>.split.csv. Rename headers with csv-header-rename toType/Color/Size, and reorder with csv-column-reorder if the feed needs a specific order.
Splitter options for SKU columns
The four controls, with values that suit delimited SKUs.
| Option | What it does | Recommended for SKUs | Default |
|---|---|---|---|
| Column to split | Picks the single source column; replaced in place | The SKU / Variant SKU column | none (must select) |
| Delimiter inside the cell | Literal string the cell is split on (not regex) | - (or _ / /) | , |
| New column prefix | Names output columns <prefix>_1, ...; defaults to source name | Attr | source column name |
| Max parts per row | Caps segments kept per row; grid width is widest row up to this cap | Leave at 100 first; tighten only to truncate | 100 |
How SKU schemes split on a hyphen
Delimiter = -. Every segment is trimmed. Width = SKU with the most segments.
| Input SKU | Segments after split | Note |
|---|---|---|
TSHIRT-RED-XL-2026 | TSHIRT | RED | XL | 2026 | Clean 4-segment SKU |
MUG-BLU-12OZ | MUG | BLU | 12OZ | 3 segments — padded to width of wider SKUs |
SHOE-BLK-10-W-EU | SHOE | BLK | 10 | W | EU | 5 segments — file grid widens to 5 columns |
PEN-BLACK-FINE- (trailing dash) | PEN | BLACK | FINE | `` | Trailing delimiter yields an empty final segment |
Free vs Pro limits (CSV family)
Browser-side limits. The splitter is text-only and runs locally.
| Tier | Max rows | Max file size | Batch files |
|---|---|---|---|
| Free | 500 | 2 MB | 2 |
| Pro | 100,000 | 100 MB | 10 |
| Developer | Unlimited | 5 GB | Unlimited |
Cookbook
Real SKU schemes and how the hyphen split handles them. SKUs are illustrative.
Four-segment SKU → attribute columns
ExampleA consistent Type-Color-Size-Year SKU. Split on hyphen with prefix Attr. The SKU column becomes four attribute columns; price and title stay put.
Input: SKU,Price TSHIRT-RED-XL-2026,19.99 TSHIRT-BLU-M-2026,19.99 Config: column = SKU, delimiter = "-", prefix = Attr Output: Attr_1,Attr_2,Attr_3,Attr_4,Price TSHIRT,RED,XL,2026,19.99 TSHIRT,BLU,M,2026,19.99
Mixed segment counts pad to a uniform grid
ExampleA 4-segment SKU and a 3-segment SKU in the same file. The width becomes 4; the shorter SKU gets an empty trailing cell — but watch positional alignment (see edge cases).
Input: SKU TSHIRT-RED-XL-2026 MUG-BLU-12OZ Config: delimiter = "-", prefix = Attr Output: Attr_1,Attr_2,Attr_3,Attr_4 TSHIRT,RED,XL,2026 MUG,BLU,12OZ, (Year is missing on the mug, so Attr_4 is empty — not misplaced, because year is the last segment.)
Trailing delimiter leaves an empty final column
ExampleA SKU ending in the delimiter (PEN-BLACK-FINE-) splits with an empty last segment, which trims to an empty string. Strip trailing dashes first if you don't want the blank column.
Input: SKU PEN-BLACK-FINE- Config: delimiter = "-" Output: SKU_1,SKU_2,SKU_3,SKU_4 PEN,BLACK,FINE,
Underscore-delimited SKUs
ExampleSome schemes use underscores. Just set the delimiter to _. Everything else works the same way.
Input: SKU SHOE_BLK_10_W Config: column = SKU, delimiter = "_", prefix = Attr Output: Attr_1,Attr_2,Attr_3,Attr_4 SHOE,BLK,10,W
Cap segments to drop a trailing batch code
ExampleIf your SKUs append a warehouse batch code you don't want in the feed, set max parts to keep only the leading attributes. Note the dropped segments are discarded, not merged.
Input:
SKU
TSHIRT-RED-XL-B2026Q2
Config: delimiter = "-", maxParts = 3
Output (4th segment dropped):
SKU_1,SKU_2,SKU_3
TSHIRT,RED,XL
("B2026Q2" is discarded — only do this when you want it gone.)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.
SKUs have inconsistent segment structure
Misaligned attributesIf TSHIRT-RED-XL (type-color-size) and RED-XL-TSHIRT (color-size-type) coexist, the same attribute lands in different columns per row — the tool splits positionally and can't reorder. Standardise your SKU scheme first, or split each scheme variant separately. Padding fixes width, not which attribute goes where.
Attribute value contains the delimiter
Over-splitA segment like T-SHIRT (with an internal hyphen) splits into T and SHIRT, throwing off every later column. A literal split can't tell an internal hyphen from a separator. Use a different delimiter in the SKU scheme, or fix those rows manually.
Trailing delimiter creates an empty column
Empty final segmentA SKU ending in the delimiter (PEN-BLACK-FINE-) produces an empty last part. Strip trailing delimiters first with csv-find-replace if you don't want a blank attribute column.
No column selected
Error: Select a column to splitClicking Split without choosing a column throws Select a column to split. Pick the SKU column's radio button; the button is disabled until a column and a non-empty delimiter are set.
Empty delimiter
Error: Delimiter cannot be emptyThe delimiter can't be blank — it throws Delimiter cannot be empty. Enter the exact separator your SKUs use (-, _, or /).
Blank SKU cell
Single empty partA product with no SKU becomes one empty part, padded to the file width. The row is kept with empty attribute cells. Drop SKU-less rows afterwards with csv-cleaner if your feed requires a SKU.
Segments past Max parts are discarded
Data lossSegments beyond the Max parts per row cap are dropped, not merged into the last column. So A-B-C-D with max parts 3 yields only A, B, C. Keep the default 100 unless you deliberately want to truncate a batch/lot code, and check Max parts seen after running.
Optional middle segment shifts everything
Positional driftIf some SKUs have an optional material segment in the middle and others don't, every attribute after it shifts one column for those rows. There's no way for a positional split to detect a missing middle segment. Normalise the scheme (use a placeholder like NA) so every SKU has the same segment count.
File exceeds free 500-row / 2 MB limit
Upgrade requiredFree tier caps at 500 rows / 2 MB. Larger catalogs need Pro (100,000 rows / 100 MB), or split into chunks first with csv-row-splitter.
Frequently asked questions
How do I split a SKU into separate attribute columns?
Drop the catalog CSV onto the splitter, select the SKU column, set the delimiter to your SKU separator (usually -), set a prefix like Attr, and run. You get Attr_1, Attr_2, ... one segment per column. Then rename them to Type / Color / Size with csv-header-rename.
My SKUs use underscores, not hyphens. Does that work?
Yes — set the delimiter to _. The split is a literal string match, so it works with any single or multi-character separator your scheme uses (-, _, /, or even --).
What if my SKUs have a different number of segments?
The tool splits positionally, so a missing or extra segment shifts the attribute columns for those rows. The grid is padded to the widest SKU, but alignment is only correct if every SKU follows the same segment order. Standardise the scheme first for reliable results.
An attribute value contains a hyphen (`T-SHIRT`). What happens?
It over-splits into T and SHIRT, shifting later columns. The literal split can't distinguish an internal hyphen from a separator. Use a different delimiter in your SKU scheme, or fix those SKUs manually.
How do I drop a trailing batch/lot code from the SKU?
Set Max parts per row to keep only the leading attributes — the trailing segments are then dropped (not merged). Confirm Max parts seen afterwards so you know exactly how many segments existed.
Why is there an empty column at the end?
A SKU ending in the delimiter (PEN-BLACK-FINE-) produces an empty final segment, or a shorter SKU gets padded with empty cells to match the widest SKU. Strip trailing delimiters with csv-find-replace if you don't want the blank column.
Are my SKUs and prices uploaded?
No. The splitter runs in your browser with PapaParse. SKUs, prices, and inventory counts are parsed locally and never sent to a server. Signed-in users have only a processed-count stat recorded.
Does it keep my price, title, and stock columns?
Yes. Only the SKU column is replaced in place by the attribute columns — every other column keeps its value and position.
How do I reorder the attribute columns for a marketplace feed?
The split keeps the new columns where the SKU was. Use csv-column-reorder on the output to match the column order your feed requires.
How many products can I process at once?
Free tier handles 500 rows / 2 MB per file. Pro raises it to 100,000 rows / 100 MB. For larger catalogs, chunk first with csv-row-splitter.
I need to build SKUs from separate attribute columns instead. Which tool?
Use csv-column-merger. It joins multiple columns into one with a separator (- for a SKU) and names the merged column.
Can I automate SKU splitting for recurring feed prep?
Yes. csv-column-splitter is available as a local runner tool (Pro tier). Configure the column, delimiter, prefix, and maxParts, and run it against a file on your machine — SKUs and pricing never reach JAD's servers. A common pipeline: export catalog, split SKU, reorder, push to feed.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.