本期案例是对字符串中相同字母进行编号,前后转换效果如下:

解题套路
1.Table.Group
解题思路:将字符串转换为列表,进行分组操作,对各子表添加索引列,然后合并列。考虑到相同字母出现的连续性,在分组前需要添加索引列,来保证转换后的字母顺序。

Table.AddColumn(源,"New",each Text.Combine(Table.Sort(Table.Combine(Table.Group(Table.AddIndexColumn(Table.FromValue(Text.Split([Old],"-")),"idx"),"Value",{"b",each Table.CombineColumns(Table.AddIndexColumn(_,"Idx",1),{"Value","Idx"},each Text.Combine(List.Transform(_,Text.From)),"Value")})[b]),"idx")[Value],"-"))
2.List.Accumulate
解题思路:ACC的第二参数是列表,其中第一项x{0}用于存放结果,第二项x{1}用于存放连续传递的字母,这样只需要通过查找当前字母在x{1}中的位置个数,即为当前字母的序号。最后对x{0}进行深化合并即为结果。

Table.AddColumn(源,"New",each Text.Combine(List.Accumulate(Text.Split([Old],"-"),{{},""},(x,y)=>{x{0}&{y&Text.From(List.Count(Text.PositionOf(x{1}&y,y,2)))},x{1}&y}){0},"-"))
Text.PositionOf既然可以,那么List.PositionOf也可以,这里只要将Acc第二参数的第二项改为列表格式即可,统计的原理不变。

Table.AddColumn(源,"New",each Text.Combine(List.Accumulate(Text.Split([Old],"-"),{{},{}},(x,y)=>{x{0}&{y&Text.From(List.Count(List.PositionOf(x{1}&{y},y,2)))},x{1}&{y}}){0},"-"))
还有一种思路:在对字符串进行拆分以后的列表lst进行逆序排列,同时将lst作为ACC第二参数的第二项。
在遍历传递的过程中,通过查找当前字母在lst中的位置个数即为序号,同时对lst进行移除最后一项。对传递的最终结果需要再进行逆序排序。

Table.AddColumn(源,"New",each let lst=Text.Split([Old],"-") in Text.Combine(List.Reverse(List.Accumulate(List.Reverse(lst),{{},lst},(x,y)=>{x{0}&{y&Text.From(List.Count(List.PositionOf(x{1},y,2)))},List.RemoveLastN(x{1})}){0}),"-"))
以上是本期内容。