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>
Text.Split函数比较简单,第一参数是需要处理的字符串,第二参数是分隔符符!当然除了上面的方面,我们还有Delimiter相关的函数也可以实现!
= List.Transform({0..9},each Text.BetweenDelimiters("/"& str,"/","/",_))
主要看一下Text.BetweenDelimiters函数!以下我们先简单看一下简化语法简化语法:Text.BetweenDelimiters(字符串,开始分隔符,结束分隔符,第几段)那么以上公式的意思,就是提取“/”之间1-10端的内容,其实和Split结果是一样的!看上去好像比Split麻烦,但是他的核心是起止分隔符!首先,我们还是来看一下开始和结束分隔符,如何使用!
= List.Transform({0..9},each Text.BetweenDelimiters(str,"<",">",_))
如果我们还要进一步处理,就可以对拆分出来的内容,这个再按“-”拆分!
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)
首先是选择列表中不为空的内容,然后每两个拆分为一组,最后转为表!比如我们先获取最后一对“<>”中的内容,该如何处理呢?
=Text.BetweenDelimiters(str,"<",">",{0,1})
前面我们有讲过,给的是简化的语法,官方完整的语法如下:核心是第四、五参数是any类型,而不是number数值类型,说明没有那么简单!案例中有:RelativePosition.FromEnd 和 RelativePosition.FromStart其他他们是枚举类型,方便阅读,我们可以使用1和0来代替RelativePosition.FromStart > 字面:从开始,其实就是正序(0)-默认RelativePosition.FromEnd >字面:从结束,其实就是倒序(1)第五参数没写,默认是0,也就是一段,但是相对于第四参数的第一段,所以是最后一段!如果还是不懂也没有关系,我们通过几个案例进一步巩固!> 倒数第2个"<",及向后数第2个“>"之间的内容!
Text.BetweenDelimiters(str,"<",">",{1,1},1)
Text.BetweenDelimiters(str,"<",">",{2,1},{0,0})
= Text.BetweenDelimiters(str,"<",">",{2,1},{1,1})
2、索引是从0开始的,也就是1表示第一个找到的位置3、案例中,“<" 用的是{2,1}也就是从后往前找到第3个"<" 也就是沙糖桔前面的"<",然后看第五参数{1,1},表示在第二参数找到的位置,倒序向前找到第二个">",然后返回之间的内容!Text.AfterDelimiter 和 Text.BeforeDelimiter 相对Text.BetweenDelimiters要简单很多,一个分隔符之后的内容如果,一个分隔符之前的内容你这个函数都掌握了,那么他们两个肯定没有问题,这里就不再啰嗦了!PowerQuery在文本处理方面非常的方便,常用的文本清洗完全可以胜任,在熟悉了常用的函数之后,可以说是随心所欲的清洗!
全部文章附件下载、海量模板分享、不限次数提问、专属答疑群都在这里