天天看点

List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进

作者:可乐之滨

List.Accumulate展开字符串案例

分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进行字符串展开,前后转换效果如下图1。

解题思路

1.以字符串“2[1[A]3[b]2[3[C]4[d]]]”举例。将字符串按分隔符“[ ]”进行拆分并逆序展开,就得到图2。

从上图可以知道,最终就是一个分组转换,这里选用ACC函数。

分组的关键在于两个节点。

第一个是连续出现的数据类型不一致的时候进行分组;

第二个是连续出现的数据类型都是数字的时候,先将前面各个分组进行合并,然后再根据最后一组数字进行重复个数操作。

2.ACC函数的第二参数为列表,第一项用于存放重复个数后的结果;第二项用于存放出现第一次分组节点前的数据,针对本案例就是出现字母字符串的时候;第三项用于存放传递的数据,每传递一次进行更新,用于判断是否出现第二次节点(见图3、图4)。

非数字型字符都大于数字型字符,这里使用最大数字9进行比较,而不用0,是为了防止其他大于0的数字而导致比较失败。

另外需要注意的是,本案例中出现的数字都是一位数,如果出现是二位数以上的,那么在进行连续两个数字的判断条件需要进行修改。可以使用两者进行相加处理,结合Expression.Evaluate,以及try…otherwise函数进行判断。其他方式可以自行去扩展下。

3.结果如图5,详细代码如下:

Table.AddColumn(源,"输出",each List.Accumulate(List.Reverse(List.Select(Text.SplitAny([输入],"[]"),each _<>"")),{{},"",""},(x,y)=>if x{2}="" or y>"9" then {x{0},y,y} else if List.ContainsAll({"0".."9"},{y,x{2}}) then {{Text.Repeat(Text.Combine(List.Reverse(x{0})),Number.From(y))},"",y} else {x{0}&{Text.Repeat(x{1},Number.From(y))},"",y}){0}{0})

List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进
List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进
List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进
List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进
List.Accumulate展开字符串案例分隔符前面的数字代表一组分隔符内字符串的个数,本期案例是根据层级对应关系,进

继续阅读