官方说明:
使用指定的拆分器功能,将指定的列拆分为一组其他列。
Table.SplitColumn( table as table, sourceColumn as text, splitter as function, optional columnNamesOrNumber as any, optional default as any, optional extraColumns as any) as table
解读:
先从可视化入手看函数吧,直接选中信息列拆分列,在开始和转换选项卡下均有拆分列的菜单选项,也可以右击鼠标下拉菜单选择拆分列。有两种拆分形式可供选择,按分隔符或按字符数,这里我们显然按分隔符逗号分列即可:
在这里作个小小的说明,当我们的分隔符是特殊符号时,可以在选择分隔符选项栏选择自定义,此时最下面的"使用特殊字符进行拆分"可选项则可以进行勾选。特殊字符及对应的写法如下:
Tab:#(tab)
回车:#(cr)
换行:#(lf)
回车和换行:#(cr)#(lf)
不间断空格:#(00A0)
特殊符号也是文本,引用时要用""包起来。
可以看到在高级选项中可选拆分为行或列,拆为列生成的公式为Table.SplitColumn
,而拆为行则会使用Table.ExpandListColumn
+Table.TransformColumns
,本文将介绍前者。什么意思呢?就是说不管是拆成行还是拆成列,第一步都是先用拆分函数将文本拆成list,然后再决定是按行展开还是按列展开。先看案例:
直接使用界面操作生成的公式如下:
= Table.SplitColumn(源, "成绩", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), {"成绩.1", "成绩.2", "成绩.3"})
其中第一参数为表;第二参数为要拆分的列名;第三参数为具体的拆分规则,参数类型为function。
强迫症患者表示接受不了自动生成的公式,上面说过其实第一步就是先用第三参数的function把文本拆为list,那我们尝试下自己拆:= Table.SplitColumn(源, "成绩",each Text.Split(_,","))
结果和自动生成的一样,说明上面的猜想是正确的。再重申一遍,整个过程分两步,第一步先生成list,第二步把list拆成列。
注意,刚才我说的是生成list,这个list可以是根据第二参数所指定的列拆出来的,也可以和原来的列没有半毛钱关系。
基于这个思路,我们可以玩出一些不按常理出牌的套路:
= Table.SplitColumn(源, "成绩",each {_&"大爱中华"})
甚至可以用来一次添加多列:
= Table.SplitColumn(源, "成绩",each List.Repeat({_},5))
= Table.SplitColumn(源, "成绩",each {"三年","二班","马云"},{"年级","班级","班主任"})
第一步生成list后,第二步就是把list拆成列,可以发现list中有几个元素就会被拆分成几列。
我们可以使用更加复杂的函数嵌套,生成各种list实现各种脑洞大开的另类用法,只要在list中继续增加元素,就可以在一个公式中无限添加列。但这毕竟是一个拆分函数,我们还是要回到拆分上。默认使用的拆分器为Splitter类函数,由于内容较多,为了让大家更好的理解不至于看完一头雾水,我单独开一篇《Splitter类函数总结》供参考。
第四参数为指定列名或者列数,如不指定列数或拆分后的列名,将以第一行对象拆分的列数作为参考。
比如上面的案例,虽然B和C拆分后只有两列,但是因为第一行拆分后有三列,所以如果没有指定第四参数,将全部以第一行的拆分后的列数为参考。
"成绩"拆分后默认被命名为"成绩.1","成绩.2",第四参数给一个列名的list,直接对拆分后的列命名,就省掉再单独做一个重命名的步骤了。这个list中有几个列名,就会被分为几列。
除了指定列名,你也可以指定列数,比如只要一列:
= Table.SplitColumn(源, "成绩",each Text.Split(_,","),1)
第五参数为缺省值的默认值,可以用具体对象替换,可以是单值、列表、记录、函数等形式。
比如上面的案例,B和C只有两门的成绩,那么拆成三列应该会出现null值,使用第五参数作为默认值:
第六参数为对多出列数的处理,有三个枚举常量ExtraValues.List
, ExtraValues.Error
, ExtraValues.Ignore
,分别可以用0,1,2代替,类似Csv.Document
中的第四参数。
比如正常情况下拆分出来应该是3列,但我们指定只要1列:
多出的列全部放在一个列表中。
再试试填1:
就会因为拆分的列数大于指定列数而引发报错了。
如果填2那就是忽略错误,只显示指定的列,超出的就不管了:
老师好!Table.SplitColumn中"_"可以代表要拆分的那一列吗?Splitter.SplitTextByAnyDelimiter的第一参数可不以使用引用了"_"的某个函数获取?
你可以直接在编辑栏输入=函数名查看函数帮助,注意各参数的类型。
Table.SplitColumn第一参数是要拆分的表,第二参数是表中要拆分的列,第三参数中可以使用"_"来表示第二参数中的列。
Splitter.SplitTextByAnyDelimiter第一参数是分隔符列表,类型是list,而不是function。
施阳老师,像这两种写法可以完成同样的效果,
①Table.SplitColumn(源,"订单信息",Splitter.SplitTextByAnyDelimiter({":","#(lf)"}))
②Table.SplitColumn(源,"订单信息",each Text.SplitAny(_,":#(lf)"))
然后如果要对拆分过程中的LIST进行操作的话,第二种写法可以直接嵌套函数比如
Table.SplitColumn(源,"订单信息",each List.Alternate(Text.SplitAny(_,":#(lf)"),1,1))但是第一种写法好像就嵌套不了了,是不是使用拆分器函数就不能在同一个步骤里面对拆分的LIST进行操作了?
=List.Alternate(Splitter.SplitTextByAnyDelimiter({":","#(lf)"})("a:b#(lf)c") ,1,1)
如果是参数二的列名不固定,而且要编列,需要怎么改写呢
写错了,应该是遍历,因为有好多列需要同样的方法拆分;感觉可以用List.Acc函数