小勤:大海,Power Query里的Text.Remove函数(参考文章《删除所有常用汉字,只要一只大乌龟》)的确好用,但都是从删除的角度去最后得到要保留的内容,但有时候文本里的内容很复杂,各种符号之类的,不好列举,说不定其中还藏着什么特殊符号,能不能直接想要哪些就保留哪些?
大海:这当然可以的,但需要几个函数结合一下。
小勤:具体是哪些函数?怎么用?能不能直接用这个例子来试试?
大海:好的。按需要保留内容的基本思路是,首先将文本拆成一个列表(List),然后对List里的所有元素进行判断,符合的就留下来。接下来咱们一步步来做一个保留所有英文的做法,最后再给一个综合的公式写法。
小勤:这样太好了。
大海:那咱们开始吧。
Step-1:获取数据
Step-2:添加自定义列,将文本拆解为列表(List),公式=Text.ToList([公司]):
结果如下:
函数Text.ToList,将文本转换为列表,文本每个字符变成一个列表里的每个元素
用法:
- Text.ToList(文本)
小栗子:
Ø Text.ToList(“Excel到PowerBI”)
Ø 结果为:{“E”,”x”,”c”,”e”,”l”,”到”,”P”,”o”,”w”,”e”,”r”,”B”,”I”}
Step-3:有了这个List,就可以对List里的内容进行筛选了,比如要所有保留英文字母,公式= List.Select([文本拆解为List],each _>="A" and_<="z"):
结果如下,其中的英文字母已经筛选出来了:
函数List.Select,按条件筛选列表中的内容
用法:
- List.Select(列表,筛选条件)
参数:
Ø 列表:要进行筛选的列表
Ø 筛选条件:对列表进行筛选的条件
小栗子:
Ø 筛选列表中大于3的元素:List.Select({1,3,5,6},each _ > 3)
Ø 结果:{5,6}
要点:
- 其中的下划线(_)表示待筛选列表中的元素,each _>3 相当于对列表中的元素进行逐个判断。
Step-4:列表都筛选出来了,最后就可以合并了,合并可以直接对列表进行操作,也可以使用Text.Combine函数(该函数用法可参考文章《动态分组合并同类项内容,最近问这个的人怎么这么多?》)
结果出来了:
小勤:嗯,我知道了,通过这样分步拆解的方式思路很清晰。
大海:对的。基于以上的思路,这些步骤可以直接合成一个公式:
实际上无论是Excel还是PQ,长公式都是一层包一层按思路写出来的。PQ里的函数嵌套会更明显一些,所以M语言也是一种函数式编程的语言,以后会有大量函数嵌套的公式,但从公式的内部往外逐层实现,整体的思路一般都是很清晰的。
小勤:嗯。而且通过这种分层的写法,看起来也很有层次感。
大海:还有怎么提取中文、数字的写法方法都差不多,你试试吧。
小勤:好!