平時我們經(jīng)常用到需要根據(jù)一定的需求在數(shù)據(jù)中把符合需求的數(shù)據(jù)提取出來,那我們看下在Power Query中是如何進行操作的挪凑。
我們知道孕索,在Power Query中數(shù)據(jù)是有多種類型的逛艰,那提取的方式也是各不一樣躏碳。
以下是一張整體的有關(guān)數(shù)據(jù)提取可能涉及到的函數(shù)集∩⒉溃可以點擊查看大圖
我們今天來主要看下文本中的數(shù)據(jù)提取菇绵。
我們知道在Power Query中對于數(shù)據(jù)類型規(guī)定的比較嚴格,所以我們在使用函數(shù)的時候也要時刻注意著數(shù)據(jù)類型镇眷,包括函數(shù)參數(shù)的類型咬最,函數(shù)生成的最終類型。
在Power Query菜單中也可以進行部分操作欠动。
從頭開始提扔牢凇(首字符)
Text.Start(string asnullable text, count asnumber) asnullable text
此函數(shù)有2個參數(shù)惑申,第1個參數(shù)是可為空的文本字符串,第2個參數(shù)是整數(shù)數(shù)字翅雏,最終生成的是可為空的文本格式圈驼。
這個函數(shù)類似Excel中的Left函數(shù),從左邊開始提取指定位數(shù)的字符望几。
例:
Text.Start("abc",1)=a
Text.Start("123",2)="12"
從尾開始提燃ù唷(結(jié)尾字符)
Text.End(string asnullable text, numChars asnumber) asnullable text
此函數(shù)和Text.Start類似,相當于Excel中的Right函數(shù)橄抹,從右邊開始提取指定位數(shù)的字符靴迫。
例:
Text.End("abc",1)=c
Text.End("123",2)="23"
從指定位置開始提取(范圍)
Text.Range(text asnullable text, offset asnumber,optionalcount asnullable number) asnullabel text
一共有3個參數(shù)楼誓,第3參數(shù)為可選項玉锌。
這個函數(shù)類似Excel中的Mid,但是有幾個地方需需要注意慌随。
參數(shù)從0開始芬沉,而不是從1開始。
(第2參數(shù)+第3參數(shù))<=文本字符數(shù)
例:
Text.Range("abc",0)=abc
Text.Range("abc",1)=bc
Text.Range("abc",0,1)=a
Text.Range("abc",1,2)=bc
Text.Range("abc",4)/?Text.Range("abc",1,3)=Error
Text.Middle(text asnullable text, start asnumber,optionalcount asnullable number) asnullable text
和Text.Range相比阁猜,優(yōu)點是不需要考慮(第2參數(shù)+第3參數(shù))<=文本字符數(shù)這個條件丸逸。
Text.BeforeDelimiter(text asnullable text, delimiteras text,optionalindex asany) asany
(分隔符之前的文本)提取指定文本之前的數(shù)據(jù)。
例:
Text.BeforeDelimiter("abc123abc","b")=a
Text.BeforeDelimiter("abc123abc","c",1)=abc123ab
Text.BeforeDelimiter("abc123abcabc","b",{2,1})=a
解釋:從文本中剃袍,根據(jù)字符"b"黄刚,從最后開始查找,并跳過2次找到的位置再提取之前的文本民效。{}列表里面憔维,第一個2代表跳過的次數(shù),第二個1代表的是從后往前數(shù)畏邢,如果是從前往后數(shù)則是0业扒。
Text.AfterDelimiter(text asnullable text, delimiteras text,optionalindex asany) asany
(分隔符之后的文本提取)指定文本之后的數(shù)據(jù)舒萎。
Text.BetweenDelimiters(text asnullable text, startDelimiter astext, endDelimiters astext,optionalstartIndex asany,optioanlendIndex asany) asany
(分隔符之間的文本)提取指定文本之間的數(shù)據(jù)程储。
根據(jù)條件提取
Text.Remove(text asnullable text, removeChars asany) asnullabel text
我們注意到,在這個函數(shù)里面臂寝,第2參數(shù)是any章鲤,那就代表可以是其他類型,例如list等咆贬。我們可以通過這個特性败徊,批量從文本中刪除指定數(shù)據(jù)并提取剩余數(shù)據(jù)。
例如:
Text.Remove("abc123", "123")=abc
Text.Remove("abc123",{"a","b","c"})="123"
我們之前了解到list的生成可以通過Unicode代碼掏缎,可以參考此文章(如何理解Power Query中的“#”轉(zhuǎn)義字符皱蹦?)煤杀。
例如我們需要刪除文本中所有的數(shù)字就可以使用列表{0..9},如果刪除所有的小寫字母{"a".."z"}
刪除全小寫字母=Text.Remove("abc123",{"a".."z"})="123"
如果要全部去掉數(shù)字,則還需添加一步轉(zhuǎn)換沪哺,因為{0..9}生成的是數(shù)字格式怜珍,但是我們要刪除的是文本格式,所以需要用到List.Transform函數(shù)進行轉(zhuǎn)換凤粗。
刪除全部數(shù)字=Text.Remove("abc123", List.Transform({0..9}, Text.From))="abc"
Text.RemoveRange(text asnullable text, offset asnumber,optionalcount asnullable number) asnullable text
和Text.Remove比酥泛,雖然都是刪除,但是性質(zhì)完全不一樣嫌拣∪嵩可以參考Text.Range,只不過一個是提取异逐,一個是刪除捶索。
另外請注意,其參數(shù)是number灰瞻,不是any腥例。
例:
Text.RemoveRange("abc123",1)="ac123"
Text.RemoveRange("abc123",0,2)="c123"
那會問,如果想要在指定位置內(nèi)批量刪除字符要如何處理呢酝润?
思路都是一樣的燎竖,我們先通過提取,然后再通過批量刪除即可要销。
例:
Text.Remove(Text.Range("abc123abc",5,4),{"a".."z"})=3
再延伸下思路构回,我們注意到很多在提取的時候都需要用到Number的數(shù)字進行定位,那我們?nèi)绾芜M行定位又是一個課題了疏咐。
例如涉及到定位的函數(shù)纤掸,Text.Length,Text.PositionOf等函數(shù)進行定位浑塞,甚至List.Sum,List.Count這類函數(shù)作為值也可以進行定位借跪,具體要看實例靈活應用。
Text.Select(text as?nullable text, selectChars as?any) as?nullable text
根據(jù)指定條件提取文本酌壕。使用方法可以參考Text.Remove掏愁,只不過一個是提取,一個是刪除仅孩。