实例需求:原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中,att1、att3、att5为一组,att2、att3、att6为另一组,数据如下所示。
更新表格数据
原始数据表:
Col1 | Col2 | Att1 | Att2 | Att3 | Att4 | Att5 | Att6 |
---|---|---|---|---|---|---|---|
AAA | DDD | X | O | alpha | delta | 100 | 400 |
BBB | EEE | Y | P | beta | vega | 200 | 500 |
结果数据表:
Col1 | Col2 | cn1 | cn3 | cn3 |
---|---|---|---|---|
AAA | DDD | X | alpha | 100 |
AAA | DDD | O | delta | 400 |
BBB | EEE | Y | beta | 200 |
BBB | EEE | P | vega | 500 |
示例代码:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
ChangedType = Table.TransformColumnTypes(Source,{{"Att1", type text}, {"Att2", type text}, {"Att3", type text}, {"Att4", type text}, {"Att5", type text}, {"Att6", type text}}),
MergedPart1 = Table.CombineColumns(ChangedType,{"Att1", "Att3", "Att5"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"Part1"),
MergedPart2 = Table.CombineColumns(MergedPart1,{"Att2", "Att4", "Att6"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"Part2"),
UnpivotedOtherCol = Table.UnpivotOtherColumns(MergedPart2, {"Col2", "Col1"}, "Attribute", "Value"),
RemovedColumns = Table.RemoveColumns(UnpivotedOtherCol,{"Attribute"}),
Output = Table.SplitColumn(RemovedColumns, "Value", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"cn1", "cn2", "cn3"})
in
Output
代码解析:
第2行代码加载源表格,表格名称为Table1。
第3行代码使用Table.TransformColumnTypes
函数将属性列的数据类型更改为文本类型。
第4行代码使用Table.CombineColumns
函数将"Att1"、“Att3"和"Att5"合并为一个列"Part1”,用逗号分隔。
使用Table.AddColumn
函数也可以增加一列"Part1",其值为"Att1"、"Att3"和"Att5"的合并结果,与第4行代码的区别在于,此代码并不能删除被合并的3列。
= Table.AddColumn(ChangedType, "Part1", each [Att1] & "," & [Att3] & "," & [Att5])
第5行代码使用Table.CombineColumns
函数将"Att2"、“Att4"和"Att6"合并为一个列"Part2”,同样用逗号分隔。
第6行代码使用Table.UnpivotOtherColumns
函数,保留"Col2"和"Col1"列,将其他列转换成"Attribute"和"Value"列。
第7行代码使用Table.RemoveColumns
函数移除不再需要的"Attribute"列。
第8行代码使用Table.SplitColumn
函数按逗号分隔"Value"列,分为"cn1"、"cn2"和"cn3"三列。
转换结果如下图所示。
总结:
使用Power Query函数和操作步骤来实现了将原始表格列数据按照指定规则转换成分列展示的目标格式,使用Table.CombineColumnsToRecord
可将多列数据合并到一个记录中。