Forum Discussion
Extracting data from string - mixed column names and values
- 4 years ago
Maybe this will work better. I'm not sure it will, but it's worth a try.
let Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content], #"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type), #"To Tables" = Table.TransformColumns(#"Added Index", {{"Data", each let Pairs = List.Split(Text.Split(_, ";"), 2), ColNames = List.Transform(Pairs, each _{1}), ColValues = List.Transform(Pairs, each _{0}) in Record.ToTable(Record.FromList(ColNames, ColValues)) , type table}} ), #"Expanded Data" = Table.ExpandTableColumn(#"To Tables", "Data", {"Name", "Value"}, {"Name", "Value"}), #"Pivoted Column" = Table.Pivot(#"Expanded Data", List.Distinct(#"Expanded Data"[Name]), "Name", "Value") in #"Pivoted Column"The idea here is that the ColName;ColRowValue pairs are similar to how a record is structured [ColName=ColRowValue]. I split each text string into a list and then use List.Split to group it into pairs, taking the names from the first element of each pair and the values from the second element of each pair. Then turn that pair of lists into a record and then a table. Expand the tables and pivot on the names.
There may be some possible buffering optimizations but I'll let you experiment with that.
Maybe this will work better. I'm not sure it will, but it's worth a try.
let
Source = Excel.CurrentWorkbook(){[Name="Data"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1, Int64.Type),
#"To Tables" = Table.TransformColumns(#"Added Index",
{{"Data", each
let
Pairs = List.Split(Text.Split(_, ";"), 2),
ColNames = List.Transform(Pairs, each _{1}),
ColValues = List.Transform(Pairs, each _{0})
in
Record.ToTable(Record.FromList(ColNames, ColValues))
, type table}}
),
#"Expanded Data" = Table.ExpandTableColumn(#"To Tables", "Data", {"Name", "Value"}, {"Name", "Value"}),
#"Pivoted Column" = Table.Pivot(#"Expanded Data", List.Distinct(#"Expanded Data"[Name]), "Name", "Value")
in
#"Pivoted Column"
The idea here is that the ColName;ColRowValue pairs are similar to how a record is structured [ColName=ColRowValue]. I split each text string into a list and then use List.Split to group it into pairs, taking the names from the first element of each pair and the values from the second element of each pair. Then turn that pair of lists into a record and then a table. Expand the tables and pivot on the names.
There may be some possible buffering optimizations but I'll let you experiment with that.