List.Transform 成绩按等级展开案例

本期是案例是需要对各项成绩的评比情况进行横向展开,每个科目对应四个评比等级,前后转换效果如(图1、图2)。

解题步骤

1.本期案例相对比较简单,这个案例其实有意思的是在标题,怎么能显示成结果的样式。这里对行进行扩展,按四个等级进行扩展,就获得了对应的行数据(图3)。

步骤1代码:

Table.ToList(源,each List.Combine(List.Transform(List.Skip(_),(x)=>List.Transform({"优","良","中","差"},(y)=>if y=x then x else ""))))

2.连接首项,直接转换为表(图4)。

步骤2代码:

Table.FromRows(Table.ToList(源,each {_{0}}&List.Combine(List.Transform(List.Skip(_),(x)=>List.Transform({"优","良","中","差"},(y)=>if y=x then x else "")))))

3.构造符合要求的标题字段。这里可以提取源标题进行扩展,比如科目“语文”,就可以按{1..4}四个进行遍历扩展,让科目前后分别插入等级对应的空格数,这样数据加载可以直接满足要求(图5)。

步骤3代码:

List.Combine(List.Transform(Table.ColumnNames(源),each if _="姓名" then {_} else List.Transform({1..4},(x)=>Text.Insert(Text.Repeat(" ",x*2),x,_))))

4.将前述两个步骤进行整合,结果如图6:

合并代码:

Table.FromRows(Table.ToList(源,each {_{0}}&List.Combine(List.Transform(List.Skip(_),(x)=>List.Transform({"优","良","中","差"},(y)=>if y=x then x else "")))),List.Combine(List.Transform(Table.ColumnNames(源),each if _="姓名" then {_} else List.Transform({1..4},(x)=>Text.Insert(Text.Repeat(" ",x*2),x,_)))))

5. 使用List.TransformMany进行扩展,结果见图7。

详细代码:

Table.FromRows(Table.ToList(源,each {_{0}}&List.TransformMany(List.Skip(_),each {"优","良","中","差"},(x,y)=>if x=y then y else "")),{"姓名"}&List.TransformMany(List.Skip(Table.ColumnNames(源)),each {1..4},(x,y)=>Text.Insert(Text.Repeat(" ",y*2),y,x)))

如果不考虑标题字段居中显示,也可以直接将科目名称与空格直接连接就可以。