优秀的编程知识分享平台

网站首页 > 技术文章 正文

Power Query文本拼接方法与Excel新函数Textjoin比试一下

nanyue 2024-10-02 17:34:28 技术文章 5 ℃

Excel新函数Textjoin函数是字符拼接的利器,与之前的“&”与CONCATENATE函数相比,简直是太好用了,比之新函数CONCAT函数也是功能更加强大些。

关于Textjoin函数和Concat函数,在我Excel函数专栏中有详细介绍。

今天我们使用Power Query来实现文本拼接,我们来看例子:

我们要像做数据透视表一样,把文本透视过来,拼接在一起。

Excel中,我们有了新函数Textjoin,这个工作就变得非常简单了,我们只需要把条件列清楚就行,如果班级等于初一,就引用班级的内容,否者为空。

=TEXTJOIN(",",TRUE,IF($A$2:$A$19=D2,$B$2:$B$19,""))

这是一个单个单元格的数组公式,需要CTRL+SHIFT+ENTER三件结束。

那么在Power Query中我们有什么办法来进行这样的拼接呢?

有两个思路:

  • 直接用Text.Combine函数拼接
  • 透视列然后合并列

Text.Combine函数

Text.Combine函数是使用指定的分隔符,来拼接列表内的文本,需要两个参数:

  • 第一参数:文本列表
  • 第二参数:分隔符

首先要做分组操作,使用年级分组

然后修改上面标红的位置的内容:

这样就可以了,代码如下:

let
 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
 更改的类型 = Table.TransformColumnTypes(源,{{"年级", type text}, {"班级", type text}}),
 分组的行 = Table.Group(更改的类型, {"年级"}, {{"计数", each Text.Combine([班级],",")}})
in
 分组的行

透视

这个也要用到,我们讲过的Power Query组内编号,然后使用组内编号透视列,然后再合并列。

第一步:组内编号

先分组>添加组内编号>展开表

第二步:透视列

删除多余的全索引列,使用组内编号透视列

第三步:合并列

使用逗号做分隔符合并选中的列

代码:

let
 源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
 更改的类型 = Table.TransformColumnTypes(源,{{"年级", type text}, {"班级", type text}}),
 已添加索引 = Table.AddIndexColumn(更改的类型, "索引", 1, 1),
 分组的行 = Table.Group(已添加索引, {"年级"}, {{"计数", each Table.AddIndexColumn(_,"A",1,1)}}),
 #"展开的“计数”" = Table.ExpandTableColumn(分组的行, "计数", {"年级", "班级", "索引", "A"}, {"年级.1", "班级", "索引", "A"}),
 删除的列 = Table.RemoveColumns(#"展开的“计数”",{"索引"}),
 已透视列 = Table.Pivot(Table.TransformColumnTypes(删除的列, {{"A", type text}}, "zh-CN"), List.Distinct(Table.TransformColumnTypes(删除的列, {{"A", type text}}, "zh-CN")[A]), "A", "班级"),
 合并的列 = Table.CombineColumns(已透视列,{"1", "2", "3", "4", "5", "6"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"已合并")
in
 合并的列

两种方法各有千秋,而且可以互相转换,第一种方法,我们也可以通过符号拆分列,变成透视列的效果,后一种方法,透视列后再合并。很多时候,我们会需要在这两种状态之间变来变去,就像和面一样,把数据揉来揉去,变成我们想要的样子。

总的说来,Textjoin函数与Text.Combine函数最为接近,

  • Textjon函数要与if函数配合实现条件文本拼接
  • Text.Combine函数需要与Table.Group函数配合,实现分组文本拼接
最近发表
标签列表