按分隔符拆分,这个方法真的太爽了!

Excel的核心是数据处理,更多倾向数值方面的处理,相对于文本的处理和清洗比较吃力,但是PQ的定位则是全面的数据清洗,专门有文本处理类函数,可以说在Excel中的各种文本难题,在PQ中都可以非常轻松来处理!

今天要聊的主题是:提取指定分隔符之间的字符串!

PQ中文本函数目前已经有40+,今天我们会涉及到的函数如下:

前三个名称中就是Delimiter,指定分隔符,后两个则是直接给定分割符号来切割,略有不同,都可以实现效果!

具体我们通过案例来说明!

数据源

<金橘-9.9>/<莱姆-18.9>/<蜜柑-6.7>/<蜜橘-9.9>/<柠檬-16.4>/<葡萄柚-9.8>/<脐橙-19.9>/<砂糖橘-14.6>/<甜橙-9.9>/<文旦-8.1>

案例学习
案例1 | 按“/”拆分字符串
= Text.Split(str,"/")
真的是不能再简单了!
Text.Split函数比较简单,第一参数是需要处理的字符串,第二参数是分隔符符!
当然除了上面的方面,我们还有Delimiter相关的函数也可以实现!
= List.Transform({0..9},each Text.BetweenDelimiters("/"& str,"/","/",_))
主要看一下Text.BetweenDelimiters函数!以下我们先简单看一下简化语法
简化语法:Text.BetweenDelimiters(字符串,开始分隔符,结束分隔符,第几段)
第几段从0开始!
那么以上公式的意思,就是提取“/”之间1-10端的内容,其实和Split结果是一样的!看上去好像比Split麻烦,但是他的核心是起止分隔符!
下面我们进一步提取名称和单价,来进一步学习:
案例2 | 提取名称和单价
首先,我们还是来看一下开始和结束分隔符,如何使用!
以下公式就是提取“<>”之间的全部内容!

= List.Transform({0..9},each Text.BetweenDelimiters(str,"<",">",_))
如果我们还要进一步处理,就可以对拆分出来的内容,这个再按“-”拆分!
把上一步的结果存储在s中,对s遍历处理即可!
List.Transform(s,each Text.Split(_,"-"))
如果你想转成表格看的更直观,可以简单操作如下:
#table关键字来构建,当然也可以使用其他table类函数来处理!
下面我们简单的看一下SplitAny,看名字大概能猜测,Any应该支持多字符串
拆分!
= Text.SplitAny(str,"<>/-")
按第二参数指定的全部字符串来拆分!
以上的结果,如果数据源对应的分隔符连续就会拆分出空内容,稍微处理一下同样可以实现名称和单价两列显示!
以下内容能看懂最好,看不懂先了解一下,以后我们见到List对应的函数,再唠!
= #table(2,List.Split(List.Select(Text.SplitAny(str,"<>/-"),each _<>""),2)
首先是选择列表中不为空的内容,然后每两个拆分为一组,最后转为表!
下面我们来谈一下反向获取数据!
案例3 | 反向获取
比如我们先获取最后一对“<>”中的内容,该如何处理呢?
=Text.BetweenDelimiters(str,"<",">",{0,1})
前面我们有讲过,给的是简化的语法,官方完整的语法如下:
核心是第四、五参数是any类型,而不是number数值类型,说明没有那么简单!
官方有一个案例:
案例中有:RelativePosition.FromEnd 和 RelativePosition.FromStart
其他他们是枚举类型,方便阅读,我们可以使用1和0来代替
那么具体是什么意思呢?
RelativePosition.FromStart  > 字面:从开始,其实就是正序(0)-默认
RelativePosition.FromEnd    >字面:从结束,其实就是倒序(1)
现在我们看案例中的公式就好理解一些了!
第五参数没写,默认是0,也就是一段,但是相对于第四参数的第一段,所以是最后一段!
如果还是不懂也没有关系,我们通过几个案例进一步巩固!
案例4 | 任意位置提取
> 倒数第2个"<",及向后数第2个“>"之间的内容!
Text.BetweenDelimiters(str,"<",">",{1,1},1)
本文由“壹伴编辑器”提供技术支持
> 倒数第三段"<>"之间的内容
完整写法:
Text.BetweenDelimiters(str,"<",">",{2,1},{0,0})
> 开始和结束都用倒序的情况
= Text.BetweenDelimiters(str,"<",">",{2,1},{1,1})
这里我们稍微解释一下:
1、记住倒叙的结束位置是相对于开始位置来讲的
2、索引是从0开始的,也就是1表示第一个找到的位置
3、案例中,“<" 用的是{2,1}也就是从后往前找到第3个"<" 也就是沙糖桔前面的"<",然后看第五参数{1,1},表示在第二参数找到的位置,倒序向前找到第二个">",然后返回之间的内容!
本文由“壹伴编辑器”提供技术支持
Text.AfterDelimiter 和 Text.BeforeDelimiter 相对Text.BetweenDelimiters要简单很多,一个分隔符之后的内容如果,一个分隔符之前的内容你这个函数都掌握了,那么他们两个肯定没有问题,这里就不再啰嗦了!
PowerQuery在文本处理方面非常的方便,常用的文本清洗完全可以胜任,在熟悉了常用的函数之后,可以说是随心所欲的清洗!

本文由“壹伴编辑器”提供技术支持

全部文章附件下载、海量模板分享、不限次数提问、专属答疑群都在这里

(0)

相关推荐