用通配符进行替换,居然还能这么玩儿? | PQ技巧

2021-08-31 16:06:01 浏览数 (3)

很多朋友都在问,Power Query里能不能使用通配符,比如最常用的星号(*),在Excel里可以实现如下图中的批量替换:

可惜,在Power Query里是没有的,比如,如果你想在替换值功能里用*做替换,是无法得到想要的结果的:

但是,我们可以看一下替换值功能生成的公式:

实际上,替换值函数Table.ReplaceValue并不是自己完成文本的替换的,替换过程却是由Replacer.ReplaceText函数完成——Power Query里,其实很多函数都是这样!

玩的是资源整合!懂不!

尤其是Table类的函数,通常都是将要处理的内容拢到一起,然后真正的活儿都交给别人来干!

那,既然都是交给别人干,是不是可以换个人干?换个方式干?如果我们能造一个可以实现类似通配符替换的自定义函数,那不就能达到目的了吗?

同时,我们还知道Replacer.ReplaceText函数有3个参数:即对x替换y为z。(如果不知道,可以参考文章《10万行30列数据乘上系数,能快一些吗?含“函数作为参数”的触类旁通方法》)。

所以,我们写一个也带3个参数的自定义函数:

这个函数其实挺简单,大致过程如下:

  1. 按通配符*号拆分(Text.Split)要替换的内容(y)得到分隔符(*号前为d{0},*号后为d{1});
  2. 对原始内容(x)按*号拆分得到的分隔符分别取分隔符之前(Text.BeforeDelimiter)和之后(Text.AfterDelimiter)的文本;
  3. 和要替换成的文本(z)连在一起。

函数写好后,我们回到前面替换步骤生成的公式里,将Replacer.ReplaceText改为自定义函数funReplaceStar,搞定!

如果我们经常要实现类似的替换,那我们就可以构造一个类似的函数,在需要进行替换的时候,按习惯进行替换值操作,然后再简单换一下步骤里的函数即可。

当然,这个函数并不完美,比如,如果要替换的内容为“*}”,即只要}之后的数据,那就可能出错:

因为Text.BeforeDelimiter或Text.AfterDelimiter函数的分隔符参数不能为空,那该怎么改进好呢?

很多朋友在问,有没有习题供练习?——这就是今天留给大家的题目了,关注公众号,发送“数据”获取源数据练起来吧,其中还有答案哦

0 人点赞