Table.SplitColumn

官方说明:

使用指定的拆分器功能,将指定的列拆分为一组其他列。
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那就是忽略错误,只显示指定的列,超出的就不管了:

6 Replies to “Table.SplitColumn”

  1. 老师好!Table.SplitColumn中"_"可以代表要拆分的那一列吗?Splitter.SplitTextByAnyDelimiter的第一参数可不以使用引用了"_"的某个函数获取?

    1. 你可以直接在编辑栏输入=函数名查看函数帮助,注意各参数的类型。
      Table.SplitColumn第一参数是要拆分的表,第二参数是表中要拆分的列,第三参数中可以使用"_"来表示第二参数中的列。
      Splitter.SplitTextByAnyDelimiter第一参数是分隔符列表,类型是list,而不是function。

  2. 施阳老师,像这两种写法可以完成同样的效果,
    ①Table.SplitColumn(源,"订单信息",Splitter.SplitTextByAnyDelimiter({":","#(lf)"}))
    ②Table.SplitColumn(源,"订单信息",each Text.SplitAny(_,":#(lf)"))
    然后如果要对拆分过程中的LIST进行操作的话,第二种写法可以直接嵌套函数比如
    Table.SplitColumn(源,"订单信息",each List.Alternate(Text.SplitAny(_,":#(lf)"),1,1))但是第一种写法好像就嵌套不了了,是不是使用拆分器函数就不能在同一个步骤里面对拆分的LIST进行操作了?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注