How to split a tags / categories column into separate columns
- Step 1Export the list with the tags column — From Kit / Mailchimp / HubSpot / your catalog, export the CSV containing the multi-value tags or categories column (often
Tags,Categories,Labels, orGroups). - Step 2Drop the CSV onto the splitter — PapaParse parses it in your browser and lists the headers as selectable columns. Tags stay local — nothing is uploaded.
- Step 3Select the tags column — Choose the radio button for the column holding the comma-separated tags. It's replaced in place by the per-tag columns; all other columns (email, name) stay where they are.
- Step 4Set the delimiter to a comma — Enter a comma in
Delimiter inside the cell. If your platform uses a different separator (a pipe or semicolon), enter that instead — it's a literal string split. - Step 5Set a prefix and review max parts — Set
New column prefixtoTagforTag_1,Tag_2. LeaveMax parts per rowat the default 100 for the first run so no tags are dropped, then readMax parts seento see how many tags the busiest row holds. - Step 6Run, check the preview, download — Click Split, confirm in the 10-row preview that each tag is in its own clean column, then download
<name>.split.csv. For a long-format (one tag per row) shape instead, see the edge case on csv-row-splitter.
Splitter options for tag columns
The four controls, with values that suit comma-separated tag cells.
| Option | What it does | Recommended for tags | Default |
|---|---|---|---|
| Column to split | Picks the single source column; replaced in place | The Tags / Categories column | none (must select) |
| Delimiter inside the cell | Literal string the cell is split on (not regex) | A comma , | , |
| New column prefix | Names output columns <prefix>_1, ...; defaults to source name | Tag | source column name |
| Max parts per row | Caps tags kept per row; grid width is the widest row up to this cap | Leave at 100 first, then tighten if needed | 100 |
How tag cells split on a comma
Delimiter = comma. Every tag is trimmed. Width = the row with the most tags.
| Input cell | Tags after split | Note |
|---|---|---|
newsletter, premium, beta | newsletter | premium | beta | Clean 3-tag split; post-comma spaces removed |
vip | vip | One tag — padded to the file width with empties |
a, b, c, d, e | a | b | c | d | e | 5 tags — file grid widens to 5 columns |
newsletter,, beta (empty middle) | newsletter | ` | beta` | Double comma yields an empty tag part |
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 tag-cell shapes and how the comma split handles them. Tags are illustrative.
Kit (ConvertKit) tags into separate columns
ExampleKit writes Tags as comma-separated within one cell. Split on comma with prefix Tag to get one tag per column for pivoting.
Input: Email,Tags user@x.com,"newsletter, premium, beta" Config: column = Tags, delimiter = ",", prefix = Tag Output (each tag trimmed): Email,Tag_1,Tag_2,Tag_3 user@x.com,newsletter,premium,beta
Mixed tag counts pad to a uniform grid
ExampleOne subscriber has three tags, another has one. The file width is 3; the one-tag row is padded with empty cells so a pivot table lines up.
Input: Email,Tags a@x.com,"newsletter, premium, beta" b@x.com,vip Config: delimiter = ",", prefix = Tag Output: Email,Tag_1,Tag_2,Tag_3 a@x.com,newsletter,premium,beta b@x.com,vip,,
Leading spaces that break segment filters are removed
ExampleA tag cell typed with spaces after commas yields premium unless trimmed. Because every part is trimmed, the leading space is gone — so a premium filter matches.
Input: Tags "newsletter, premium, beta" Config: delimiter = "," Output (trimmed — filter-safe): Tags_1,Tags_2,Tags_3 newsletter,premium,beta
Split a product Categories column
ExampleProduct catalogs store Categories as Apparel > Mens > Shirts or comma lists. For a comma list, split on comma; for the > breadcrumb, set the delimiter to > (the surrounding spaces are trimmed away).
Input: SKU,Categories A100,"Apparel > Mens > Shirts" Config: column = Categories, delimiter = ">", prefix = Cat Output (each level trimmed): SKU,Cat_1,Cat_2,Cat_3 A100,Apparel,Mens,Shirts
Single tag stays in one column
ExampleIf every row has exactly one tag, the split produces one column. With no other tags to widen the grid, the column keeps a single name with no numeric suffix.
Input: Email,Tags a@x.com,vip b@x.com,trial Config: delimiter = ",", prefix = Tag Output (single part everywhere -> no suffix): Email,Tag a@x.com,vip b@x.com,trial
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.
Hidden NBSPs in tags from mobile input
Filter mismatchTags typed on iOS often have CHAR(160) non-breaking spaces after commas instead of regular spaces. The split's .trim() removes standard whitespace but an NBSP embedded inside a tag (premium) survives, so the value still won't match a premium filter. Fold NBSPs first with csv-find-replace (NBSP -> normal space) before splitting.
Empty tag between two commas
Empty tag columnnewsletter,, beta splits into newsletter, ` (empty), beta — the double comma yields an empty part that trims to an empty string rather than being dropped. Remove double commas first with [csv-find-replace](/tool/csv-find-replace) (,, -> ,`) if you don't want the blank column.
Tag value itself contains a comma
Over-splitA tag like Shirts, Tees (with an internal comma) splits into two. The literal comma split can't tell an internal comma from a separator. Quote such tags isn't enough at the cell level — use a different delimiter in the source, or fix those rows manually.
No column selected
Error: Select a column to splitClicking Split without selecting a column throws Select a column to split. Choose the tags 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 a comma (or your platform's separator).
Subscriber with no tags
Single empty partA blank Tags cell becomes one empty part, padded to the file width. The row is kept with empty tag columns. That is expected — filter out tag-less subscribers afterwards if you only want tagged ones.
Very tag-heavy row widens the whole file
Wide gridOne subscriber with 40 tags makes the file 40 tag-columns wide; everyone else gets 39 empty cells. If that's unwieldy, set Max parts per row to keep only the first N tags (the rest are dropped, not merged), or consider a long-format split with csv-row-splitter.
Tags past Max parts are discarded
Data lossTags beyond the Max parts per row cap are dropped, not collapsed into the last column. Keep the default 100 unless you intend to truncate, and check Max parts seen after running to confirm nothing was lost.
File exceeds free 500-row / 2 MB limit
Upgrade requiredFree tier caps at 500 rows / 2 MB. Larger segment exports need Pro (100,000 rows / 100 MB), or split into chunks first with csv-row-splitter.
Frequently asked questions
How do I split a comma-separated tags column into separate columns?
Drop the CSV onto the splitter, select the tags column, set the delimiter to a comma, set a prefix like Tag, and run. You get Tag_1, Tag_2, ... one tag per column, with each tag trimmed.
Why do my tags have leading spaces, and does the splitter fix them?
Tags typed as a, b, c have a space after each comma. The splitter trims every part, so b becomes b automatically — no separate trim step needed. This matters because a leading-space tag silently fails Kit/Mailchimp segment filters.
Some subscribers have 2 tags, some have 6. Will the columns line up?
Yes. The file width is set by the subscriber with the most tags, and shorter rows are padded with empty cells. So a pivot table or VLOOKUP across the tag columns stays aligned.
Can I split a product Categories breadcrumb (`A > B > C`)?
Yes. Set the delimiter to > instead of a comma. Each level is trimmed, so Apparel > Mens > Shirts becomes Apparel, Mens, Shirts.
What about hidden non-breaking spaces in mobile-typed tags?
The split trims normal whitespace, but a non-breaking space (CHAR 160) embedded inside a tag survives and will still break filters. Run csv-find-replace to replace NBSPs with normal spaces before splitting.
What if a tag itself contains a comma?
A comma split will break it into two columns — the tool can't distinguish an internal comma from a separator. Use a different delimiter in the source (pipe/semicolon) and split on that, or fix those rows manually.
Are subscriber tags uploaded anywhere?
No. The splitter runs in your browser with PapaParse. Tags, emails, and segment data are parsed locally and never sent to a server. Signed-in users have only a processed-count stat recorded.
How many rows can I process?
Free tier handles 500 rows / 2 MB. Pro raises it to 100,000 rows / 100 MB. For larger exports, chunk first with csv-row-splitter.
I'd rather have one tag per row (long format), not per column. Can this tool do that?
No — this tool produces columns, not rows. For one tag per row, this isn't the right tool; the column-to-rows reshape isn't a feature here. Split into columns first, then reshape in your spreadsheet, or use a separate long-format workflow.
I need to recombine tag columns back into one cell. Which tool?
Use csv-column-merger. It joins multiple columns into one with a separator (, for a tag list) and names the merged column.
Will it keep my email and name columns?
Yes. Only the selected tags column is replaced in place — every other column keeps its value and position.
Can I automate this for a recurring export?
Yes. csv-column-splitter is available as a local runner tool (Pro tier). Configure the column, delimiter, prefix, and maxParts, and run it on a file locally — tags never reach JAD's servers. A common pipeline: export from Kit, split tags, pivot, repeat monthly.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.