本期案例是进行如下的格式转换,列标题中包含了类别大类的名称,需要将其转换到单独的列进行显示:
解题套路
1.Table.ToList
(1)对于行内转换,总体思路是先按每两列进行拆分,然后与对应标题字段进行压缩,最后连接编码对应数据:
Table.ToList(源,each
List.Transform(List.Split(List.Skip(List.Zip({Table.ColumnNames(源),_})),2),(x)=>
{_{0}}&List.RemoveRange(List.Combine(x),2,1)
)
)
(2)将列表转换为表并合并子表:
Table.Combine(
Table.ToList(源,each
Table.FromRows(
List.Transform(List.Split(List.Skip(List.Zip({Table.ColumnNames(源),_})),2),(x)=>
{_{0}}&List.RemoveRange(List.Combine(x),2,1)
),
{"编码","类别大类","类别名称","类别编码"})
)
)
(3)类别大类中数据多了“名称”字符,可以通过列转换函数进行转换:
Table.TransformColumns(
Table.Combine(
Table.ToList(源,each
Table.FromRows(
List.Transform(List.Split(List.Skip(List.Zip({Table.ColumnNames(源),_})),2),(x)=>
{_{0}}&List.RemoveRange(List.Combine(x),2,1)
),
{"编码","类别大类","类别名称","类别编码"})
)
),
{"类别大类",each Text.Replace(_,"名称","")})
(4)当然也可以再压缩环节先对名称进行转换,那最后就可以少一个转换步骤:
Table.Combine(
Table.ToList(源,each
Table.FromRows(
List.Transform(List.Split(List.Skip(List.Zip({List.Transform(Table.ColumnNames(源),
each Text.Replace(_,"姓名","")),_})),2),(x)=>{_{0}}&List.RemoveRange(List.Combine(x),2,1)
),
{"编码","类别大类","类别名称","类别编码"})
)
)
2.Table.Group
分组函数的实际转换的思路都比较类似,这里不使用压缩函数,而是采用降标题的方式:
Table.Combine(
Table.Group(源,"编码",{"a",each
Table.TransformColumns(Table.FromRows(
List.Transform(List.Split(List.Skip(Table.ToColumns(Table.DemoteHeaders(_))),2),(x)=>{[编码]{0}}&List.ReplaceRange(List.Combine(x),2,1,{})),
{"编码","类别大类","类别名称","类别编号"}),{"类别大类",each Text.Replace(_,"名称","")})
})[a]
)
3.Table.UnpivotOtherColumns
先进行逆透视处理,接着统一类别大类的数据格式,然后做分组处理:
Table.Combine(
Table.Group(
Table.TransformColumns(
Table.UnpivotOtherColumns(源,{"编码"},"属性","值"),
{"属性",each Text.SplitAny(_,"名称编号"){0}}),
{"编码","属性"}, {"a",each Table.FromRows({{[编码]{0},[属性]{0}}&[值]},{"编码","类别大类","类别名称","类别编号"})}
)[a]
)
以上是本期内容。