Text.Remove/Select

官方说明:

返回文本值text已删除了removeChars的所有字符的副本。
Text.Remove(text as nullable text, removeChars as any) as nullable text

解读:

本文将介绍Text.RemoveText.Select两个函数,由于语法及用法类似,所以放在一起讲。

Text.Remove第一参数为文本,但第二参数类型是as any。
这里的any并不是指可以为任意类型,而是只有文本和列表两种模式。
首先看文本模式,= Text.Remove("29岁","岁"),从文本中删除指定文本,即删除"岁"字,结果为"29"。
注意第二参数只支持单字符,比如反过来= Text.Remove("29岁","29")这样就不对,因为"29"不是单字符。

如果要删除多字符就要用到列表模式,= Text.Remove("29岁",{"2","9"}),把需要删除的单字符一个一个放在列表中。

Power Query中的文本采用的是Unicode编码,比如"0"对应的编码为48,"9"对应的编码为57,其他文本型数字的编码都在这两个之间,所以{"0".."9"}就可以作为表示所有文本型数字的连续列表。
目前Unicode字符集共收录了10W多个字符,其中汉字大概4W多个,可使用= List.Transform({1..41000},Character.FromNumber)查看包含汉字的所有字符。
汉字开头的是"一",最末尾的是这些:

基本上没几个认识的字,其中比较好输入的就是"龟",所以{"一".."龟"}就大概可以代表所有汉字了,再后面的也很少会遇到。
同样的,{"A".."z"}代表所有英文大小写字母。

下面开始来做题目,需要从姓名列中提取出中文名、英文名和年龄:

文本提取两种思路,一种是保留需要的,另一种是删除不要的。
提取中文名,我们就删除所有英文字母、数字、逗号和"岁",= Text.Remove([姓名],{"A".."z","0".."9",",","岁"})
提取英文名,那就删除所有中文、数字、逗号和"岁",= Text.Remove([姓名],{"一".."龟","0".."9",",","岁"})
但中文有4W多个,每次遍历所有汉字删除的话效率太慢了,所有我们提取年龄时换个思路:先把数字删除,然后从原文本中去掉删除后的结果,最后就只剩数字了,这样一来删除的字符数直接从几万变成了几十。
= Text.Remove([姓名],Text.ToList(Text.Remove([姓名],{"0".."9"})))

Text.Select是Power BI Desktop12月版本更新中新增的函数,目前Excel中还没有,不过大概应该在一个月之内会更新出来。
用法与Text.Remove类似,但功能相反,区别就在于——你不要的我都要。remove是删除第二参数里包含的字符,而select是仅保留第二参数里包含的字符。
在提取英文、提取数字时比remove方便一些,比如上题中提取英文名,直接= Text.Select([姓名],{"A".."z"}),而不用去遍历汉字。

附件

12 Replies to “Text.Remove/Select”

    1. 大概就是先List.Buffer(关键词[关键词])转为内存列表,然后添加列List.Select(list,(x)=>Text.Contains([文献名称],x)),1W行的话目测应该是秒出结果。
      可以参考http://pqfans.com/2466.html里不同方法的效率对比,要么就发文件给我。

  1. 请问,带小数点的数字用Text.Select函数取数后小数点丢失,如10001.23取数后为1000123。这情况如何解决。谢谢!

  2. 话说Excel2016的pq版本里没有Text.Select函数,话说如何用Text.Remove实现类似Text.Select函数的效果呢?

    1. 中文和数字,获得数字,就是删除中文,或者,先删数字得到中文,然后用中文和数字删除得到的中文

  3. ```首先看文本模式,= Text.Remove("29岁","岁"),从文本中删除指定文本,即删除"岁"字,结果为"29"。
    注意第二参数只支持单字符,比如反过来= Text.Remove("29岁","29")这样就不对,```

    那么怎么剔除多字符呢?

    1. 文章里面写的也有,复杂的替换可以用list.accumulate做,或者用替换的函数也行,具体觉得多看函数字典比较好

  4. 换个思路
    先把数字删除,然后从原文本中去掉删除后的结果,最后就只剩数字了,这样一来删除的字符数直接从几万变成了几十。
    = Text.Remove([姓名],Text.ToList(Text.Remove([姓名],{"0".."9"})))
    ----------------
    这个没想到,这下学到了!!

发表回复

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