如何在Power Query中提取数据?——文本篇

平时我们经常用到需要根据一定的需求在数据中把符合需求的数据提取出来,那我们看下在Power Query中是如何进行操作的。

我们知道,在Power Query中数据是有多种类型的,那提取的方式也是各不一样。

以下是一张整体的有关数据提取可能涉及到的函数集。可以点击查看大图

我们今天来主要看下文本中的数据提取。

我们知道在Power Query中对于数据类型规定的比较严格,所以我们在使用函数的时候也要时刻注意着数据类型,包括函数参数的类型,函数生成的最终类型。

在Power Query菜单中也可以进行部分操作。

从头开始提取(首字符)

Text.Start(string asnullable text, count asnumber) asnullable text

此函数有2个参数,第1个参数是可为空的文本字符串,第2个参数是整数数字,最终生成的是可为空的文本格式。

这个函数类似Excel中的Left函数,从左边开始提取指定位数的字符。

例:

Text.Start("abc",1)=a

Text.Start("123",2)="12"

从尾开始提取(结尾字符)

Text.End(string asnullable text, numChars asnumber) asnullable text

此函数和Text.Start类似,相当于Excel中的Right函数,从右边开始提取指定位数的字符。

例:

Text.End("abc",1)=c

Text.End("123",2)="23"

从指定位置开始提取(范围)

Text.Range(text asnullable text, offset asnumber,optionalcount asnullable number) asnullabel text

一共有3个参数,第3参数为可选项。

这个函数类似Excel中的Mid,但是有几个地方需需要注意

参数从0开始,而不是从1开始。

(第2参数+第3参数)<=文本字符数

例:

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相比,优点是不需要考虑(第2参数+第3参数)<=文本字符数这个条件。

Text.BeforeDelimiter(text asnullable text, delimiteras text,optionalindex asany) asany

(分隔符之前的文本)提取指定文本之前的数据。

例:

Text.BeforeDelimiter("abc123abc","b")=a

Text.BeforeDelimiter("abc123abc","c",1)=abc123ab

Text.BeforeDelimiter("abc123abcabc","b",{2,1})=a

解释:从文本中,根据字符"b",从最后开始查找,并跳过2次找到的位置再提取之前的文本。{}列表里面,第一个2代表跳过的次数,第二个1代表的是从后往前数,如果是从前往后数则是0。

Text.AfterDelimiter(text asnullable text, delimiteras text,optionalindex asany) asany

(分隔符之后的文本提取)指定文本之后的数据。

Text.BetweenDelimiters(text asnullable text, startDelimiter astext, endDelimiters astext,optionalstartIndex asany,optioanlendIndex asany) asany

(分隔符之间的文本)提取指定文本之间的数据。

根据条件提取

Text.Remove(text asnullable text, removeChars asany) asnullabel text

我们注意到,在这个函数里面,第2参数是any,那就代表可以是其他类型,例如list等。我们可以通过这个特性,批量从文本中删除指定数据并提取剩余数据。

例如:

Text.Remove("abc123", "123")=abc

Text.Remove("abc123",{"a","b","c"})="123"

我们之前了解到list的生成可以通过Unicode代码,可以参考此文章(如何理解Power Query中的“#”转义字符?)。

例如我们需要删除文本中所有的数字就可以使用列表{0..9},如果删除所有的小写字母{"a".."z"}

删除全小写字母=Text.Remove("abc123",{"a".."z"})="123"

如果要全部去掉数字,则还需添加一步转换,因为{0..9}生成的是数字格式,但是我们要删除的是文本格式,所以需要用到List.Transform函数进行转换。

删除全部数字=Text.Remove("abc123", List.Transform({0..9}, Text.From))="abc"

Text.RemoveRange(text asnullable text, offset asnumber,optionalcount asnullable number) asnullable text

和Text.Remove比,虽然都是删除,但是性质完全不一样。可以参考Text.Range,只不过一个是提取,一个是删除。

另外请注意,其参数是number,不是any

例:

Text.RemoveRange("abc123",1)="ac123"

Text.RemoveRange("abc123",0,2)="c123"

那会问,如果想要在指定位置内批量删除字符要如何处理呢?

思路都是一样的,我们先通过提取,然后再通过批量删除即可。

例:

Text.Remove(Text.Range("abc123abc",5,4),{"a".."z"})=3

再延伸下思路,我们注意到很多在提取的时候都需要用到Number的数字进行定位,那我们如何进行定位又是一个课题了。

例如涉及到定位的函数,Text.Length,Text.PositionOf等函数进行定位,甚至List.Sum,List.Count这类函数作为值也可以进行定位,具体要看实例灵活应用。

Text.Select(text as nullable text, selectChars as any) as nullable text

根据指定条件提取文本。使用方法可以参考Text.Remove,只不过一个是提取,一个是删除。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容