Forum Discussion
Split a cell values in a column to multiple columns by value
- 9 years ago
A solution in Power Query would be to:
- add an Index column,
- split the Q column in a new column,
- expand this new column,
- add a new column with prefix "V",
- pivot (I included an exotic sort (on the numeric number part of the prefixed value),
just because it can and because it is Saturday today), - sort back to the original sort
- remove the Index column
This video takes you through all the steps:
let Source = Table1, Indexed = Table.AddIndexColumn(Source, "Index", 0, 1), Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")), Expanded = Table.ExpandListColumn(Splitted, "Splitted"), Prefixed = Table.AddColumn(Expanded, "Inserted Prefix", each "V" & [Splitted], type text), Pivoted = Table.Pivot(Prefixed, List.Sort(List.Distinct(Prefixed[#"Inserted Prefix"]), (x,y) => Value.Compare(Number.From(Text.Middle(x,1)), Number.From(Text.Middle(y,1)))), "Inserted Prefix", "Splitted"), OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}), RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"}) in RemovedIndex - 9 years ago
"I have 2 questions" followed by a list of 5...
Anyhow, if you have mixed data, then I would suggest to sort the data before pivotting.
Now the pivot step looks like:
and the entire query code:
let Source = Table1, Indexed = Table.AddIndexColumn(Source, "Index", 0, 1), Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")), Expanded = Table.ExpandListColumn(Splitted, "Splitted"), AddedSortColumn = Table.Buffer(Table.AddColumn(Expanded, "SortColumn", each try Number.From([Splitted]) otherwise [Splitted])), Sorted = Table.Sort(AddedSortColumn,{{"SortColumn", Order.Ascending}}), RemovedSortColumn = Table.RemoveColumns(Sorted,{"SortColumn"}), Prefixed = Table.AddColumn(RemovedSortColumn, "Inserted Prefix", each "V" & [Splitted], type text), Pivoted = Table.Pivot(Prefixed, List.Distinct(Prefixed[#"Inserted Prefix"]), "Inserted Prefix", "Splitted"), OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}), RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"}) in RemovedIndexThe solution is dynamic as it adds all required columns, also if future data require more/less columns.
So with your latest example added, I got the following result with column "Vother" automatically added:
Hi Phil_Seamark
Thanks for your suggestion, I have 30 questions and each question has many options (as a total options 244). So that means I have to create 244 columns. :)
The "V" letter used to explain that the options values woulded to be the columns names.
I wish there is another way to get that. :), may Power BI add these future to coming release.
Best Regards
Mahmoud
mahmoud did you overlook my post?
- mahmoud9 years agoHelper I
Hi MarcelBeug
Thanks for your help, I am trying your method, I cerate a seprat table as you did it is work.
But when I come to real data, it is stoped at Pivot Column step.
It give me an error
DataFormat.Error: We couldn't convert to Number.
Details:
3 9 otherI have two questions:
- if the column Q has a value such as " 3 9 other" will affect the process, because I am working with text values.
- is it possible to record or show images using Power Query interface (full screen to see if I forget step or did mistakes)
- with this number of questions, I have to repeat the procrss for each column?
- if my column name has (/) shall i remove this / from all columns names?
- if some selected the option 7 in the future, shall i have to repeate the process or it will automaticly add this new values as a new column?
Thanks for your support!
Best Regards
Mahmoud
Tried to use the index column as values column
- MarcelBeug9 years agoCommunity Champion
"I have 2 questions" followed by a list of 5...
Anyhow, if you have mixed data, then I would suggest to sort the data before pivotting.
Now the pivot step looks like:
and the entire query code:
let Source = Table1, Indexed = Table.AddIndexColumn(Source, "Index", 0, 1), Splitted = Table.AddColumn(Indexed, "Splitted", each Text.Split([Q], " ")), Expanded = Table.ExpandListColumn(Splitted, "Splitted"), AddedSortColumn = Table.Buffer(Table.AddColumn(Expanded, "SortColumn", each try Number.From([Splitted]) otherwise [Splitted])), Sorted = Table.Sort(AddedSortColumn,{{"SortColumn", Order.Ascending}}), RemovedSortColumn = Table.RemoveColumns(Sorted,{"SortColumn"}), Prefixed = Table.AddColumn(RemovedSortColumn, "Inserted Prefix", each "V" & [Splitted], type text), Pivoted = Table.Pivot(Prefixed, List.Distinct(Prefixed[#"Inserted Prefix"]), "Inserted Prefix", "Splitted"), OriginalSort = Table.Sort(Pivoted,{{"Index", Order.Ascending}}), RemovedIndex = Table.RemoveColumns(OriginalSort,{"Index"}) in RemovedIndexThe solution is dynamic as it adds all required columns, also if future data require more/less columns.
So with your latest example added, I got the following result with column "Vother" automatically added:
- mahmoud9 years agoHelper I
MarcelBeugthank you very much!, I am sorry to type I have two questions then wrote five. :smileywink:
I was wroting the questions, during that I remombered other scenario but I forget to correct the number of questions :smileylol:I will try again to get same results. I will check the values.
Best Regards
Mahmoud