小勤:大海,为什么原来做的这个拆分列,现在数据增加后不对了?
大海:啊。你这个拆分列是在原来最多只有3个内容的时候做的?
小勤:对啊,但现在有4个内容的,分列出来也只有3个。
大海:嗯。这个直接操作的方法是有点儿问题,主要是因为,操作分列的时候,PQ会直接生成固定的列名,原来最多只要3个内容,就只生成了3列,所以以后有更多的数据时,就没有地方放了。你看原来生成的代码:
小勤:啊。原来这样。那怎么办呢?
大海:既然找到原因了,咱们就想办法直接构造出一个动态序列给它呗。
小勤:那我们得先知道会分出来多少列啊。
大海:嗯。你想想,如果知道其中有几个“-”,是不是就知道会分出来多少列了?
小勤:对啊。有几个“-”,然后加1,就是多少列了。
大海:嗯。然后咱们知道了每一个行会有多少列,那咱们也就可以知道最大可能有多少列了,这样咱们就可以动态的生成列名了。
小勤:对啊。那具体怎么做呢?感觉这个公式好像也有点儿复杂。
大海:这样:
Step-01:我们在拆分列之前,先识别每行里有多少项内容:
List.Count(
Text.PositionOf(
[待拆分列],
"-",
Occurrence.All
)
)
1
其中Text.PositionOf用于识别在[待拆分列]中"-"的位置,Occurrence参数有种可选项:
- Occurrence.All:返回所有要查找字符(“-”)的位置列表;
- Occurrence.First:返回第一个要查找字符(“-”)的位置;
- Occurrence.Last:返回最后一个要查找字符(“-”)的位置;
List.Count对返回的所有位置进行计数,即得到有多少个“-”,再加1就是内容项数。
Step-02:修改原拆分列代码中的固定列名列表为动态列名列表
{"1"..Text.From(List.Max(已添加自定义[内容数]))}
- 用List.Max读取前面一步生成的列(还记得对前面步骤生成的结果的列怎么引用的吗?不记得的话回去看看文章《PQ-M及函数:重要!很重要!非常重要!理解PQ里的数据结构之二、行列引用》)的最大值,得到最多可能分出的内容数。
- 然后用Text.From转为文本(因为列名必须是文本)
- 最后用构造列表的方法去得到动态的字段名序列。
小勤:啊。理解了,反正就是想办法根据内容的最大项数构造一个动态的列名列表给拆分列的步骤去用。
大海:对的。
小勤:那要是超过10列怎么办?用{"1"..##}的方式会不会出错啊?
大海:好问题。你试试?
小勤:出错了。
大海:对的。如果超过10项内容,会出错,因为简单的构造字符列表不能出现2个字符的内容。
小勤:那怎么办?
大海:那需要进一步使用其他的函数,先提供个思路给你,比如可以先直接生成数字序列【{1..List.Max()}】,然后将数字序列转换为文本序列【List.Transform】,你自己查文档试试?
小勤:嗯。我试试。
大海:随着慢慢理解PQ的操作和M语言及函数的用法,一定要学会自己查文档解决问题,才可能更加快速的提升。
小勤:好的。师父领进门,修行在个人嘛。