本期案例案例要求是把空值和大于6的数据,都替换成前一列对应行的数据,前后转换效果如下:

解题套路

1.Table.ToList


(相关资料图)

解题思路:结合ACC函数对行的每一项数据进行循环转换。

Table.FromRows(Table.ToList(源,each List.Accumulate(_,{{},""},(x,y)=>if y=null or y>=6 then {x{0}&{x{1}},x{1}} else {x{0}&{y},y}){0}),Table.ColumnNames(源))

这个题其实隐含了一个条件,就是第一列肯定是满足要求的,不然后续就无法进行传递操作。

2.Table.ReplaceValue

解题思路:这里搭配ACC使用应该是最优的组合方式,针对Table.ReplaceValue的第二参数的获得,这里有个取巧的成分。

针对第二列,字段名中包含数字2,而它需要取值当前行的索引位置是0,因此这里可以使用2-2获得。当然,这里也可以使用位置函数进行判断,或者让字段与序列组合使用。

List.Accumulate(Table.ColumnNames(源),源,(s,c)=>Table.ReplaceValue(s,each Record.ToList(_){Number.From(Text.Select(c,{"0".."9"}))-2},0,(x,y,z)=>if x=null or x>=6 then y else x,{c}))

使用List.PositionOf函数:

List.Accumulate(Table.ColumnNames(源),源,(s,c)=>Table.ReplaceValue(s,each Record.ToList(_){List.PositionOf(Table.ColumnNames(源),c)-1},0,(x,y,z)=>if x=null or x>=6 then y else x,{c}))

这里不需要考虑第一列对应字段获取的错误值,因为Table.ReplaceValue有个容错机制,对应错误值会自动判断没有进行替换。

以上是本期内容。

推荐内容