Excel的核心是數(shù)據(jù)處理,更多傾向數(shù)值方面的處理,相對于文本的處理和清洗比較吃力,但是PQ的定位則是全面的數(shù)據(jù)清洗,專門有文本處理類函數(shù),可以說在Excel中的各種文本難題,在PQ中都可以非常輕松來處理!
今天要聊的主題是:提取指定分隔符之間的字符串!
PQ中文本函數(shù)目前已經(jīng)有40+,今天我們會涉及到的函數(shù)如下:
前三個名稱中就是Delimiter,指定分隔符,后兩個則是直接給定分割符號來切割,略有不同,都可以實現(xiàn)效果!
具體我們通過案例來說明!
▲數(shù)據(jù)源 <金橘-9.9>/<萊姆-18.9>/<蜜柑-6.7>/<蜜橘-9.9>/<檸檬-16.4>/<葡萄柚-9.8>/<臍橙-19.9>/<砂糖橘-14.6>/<甜橙-9.9>/<文旦-8.1> Text.Split函數(shù)比較簡單,第一參數(shù)是需要處理的字符串,第二參數(shù)是分隔符符!當(dāng)然除了上面的方面,我們還有Delimiter相關(guān)的函數(shù)也可以實現(xiàn)!= List.Transform({0..9},each Text.BetweenDelimiters("/"& str,"/","/",_)) 主要看一下Text.BetweenDelimiters函數(shù)!以下我們先簡單看一下簡化語法簡化語法:Text.BetweenDelimiters(字符串,開始分隔符,結(jié)束分隔符,第幾段)那么以上公式的意思,就是提取“/”之間1-10端的內(nèi)容,其實和Split結(jié)果是一樣的!看上去好像比Split麻煩,但是他的核心是起止分隔符!下面我們進一步提取名稱和單價,來進一步學(xué)習(xí):首先,我們還是來看一下開始和結(jié)束分隔符,如何使用! 以下公式就是提取“<>”之間的全部內(nèi)容!
= List.Transform({0..9},each Text.BetweenDelimiters(str,"<",">",_)) 如果我們還要進一步處理,就可以對拆分出來的內(nèi)容,這個再按“-”拆分! 把上一步的結(jié)果存儲在s中,對s遍歷處理即可!
List.Transform(s,each Text.Split(_,"-")) 如果你想轉(zhuǎn)成表格看的更直觀,可以簡單操作如下:#table關(guān)鍵字來構(gòu)建,當(dāng)然也可以使用其他table類函數(shù)來處理!下面我們簡單的看一下SplitAny,看名字大概能猜測,Any應(yīng)該支持多字符串
= Text.SplitAny(str,"<>/-") 以上的結(jié)果,如果數(shù)據(jù)源對應(yīng)的分隔符連續(xù)就會拆分出空內(nèi)容,稍微處理一下同樣可以實現(xiàn)名稱和單價兩列顯示! 以下內(nèi)容能看懂最好,看不懂先了解一下,以后我們見到List對應(yīng)的函數(shù),再嘮!
= #table(2,List.Split(List.Select(Text.SplitAny(str,"<>/-"),each _<>""),2) 首先是選擇列表中不為空的內(nèi)容,然后每兩個拆分為一組,最后轉(zhuǎn)為表! 比如我們先獲取最后一對“<>”中的內(nèi)容,該如何處理呢?=Text.BetweenDelimiters(str,"<",">",{0,1}) 前面我們有講過,給的是簡化的語法,官方完整的語法如下: 核心是第四、五參數(shù)是any類型,而不是number數(shù)值類型,說明沒有那么簡單! 案例中有:RelativePosition.FromEnd 和 RelativePosition.FromStart其他他們是枚舉類型,方便閱讀,我們可以使用1和0來代替 RelativePosition.FromStart > 字面:從開始,其實就是正序(0)-默認RelativePosition.FromEnd >字面:從結(jié)束,其實就是倒序(1)現(xiàn)在我們看案例中的公式就好理解一些了! 第五參數(shù)沒寫,默認是0,也就是一段,但是相對于第四參數(shù)的第一段,所以是最后一段! 如果還是不懂也沒有關(guān)系,我們通過幾個案例進一步鞏固!> 倒數(shù)第2個"<",及向后數(shù)第2個“>"之間的內(nèi)容!
Text.BetweenDelimiters(str,"<",">",{1,1},1) > 倒數(shù)第三段"<>"之間的內(nèi)容
Text.BetweenDelimiters(str,"<",">",{2,1},{0,0}) = Text.BetweenDelimiters(str,"<",">",{2,1},{1,1}) 1、記住倒敘的結(jié)束位置是相對于開始位置來講的2、索引是從0開始的,也就是1表示第一個找到的位置3、案例中,“<" 用的是{2,1}也就是從后往前找到第3個"<" 也就是沙糖桔前面的"<",然后看第五參數(shù){1,1},表示在第二參數(shù)找到的位置,倒序向前找到第二個">",然后返回之間的內(nèi)容!Text.AfterDelimiter 和 Text.BeforeDelimiter 相對Text.BetweenDelimiters要簡單很多,一個分隔符之后的內(nèi)容如果,一個分隔符之前的內(nèi)容你這個函數(shù)都掌握了,那么他們兩個肯定沒有問題,這里就不再啰嗦了!PowerQuery在文本處理方面非常的方便,常用的文本清洗完全可以勝任,在熟悉了常用的函數(shù)之后,可以說是隨心所欲的清洗!
全部文章附件下載、海量模板分享、不限次數(shù)提問、專屬答疑群都在這里
|