很多朋友都在问,Power Query里能不能使用通配符,比如最常用的星号(*),在Excel里可以实现如下图中的批量替换:
可惜,在Power Query里是没有的,比如,如果你想在替换值功能里用*做替换,是无法得到想要的结果的:
但是,我们可以看一下替换值功能生成的公式:
实际上,替换值函数Table.ReplaceValue并不是自己完成文本的替换的,替换过程却是由Replacer.ReplaceText函数完成——Power Query里,其实很多函数都是这样!
玩的是资源整合!懂不!
尤其是Table类的函数,通常都是将要处理的内容拢到一起,然后真正的活儿都交给别人来干!
那,既然都是交给别人干,是不是可以换个人干?换个方式干?如果我们能造一个可以实现类似通配符替换的自定义函数,那不就能达到目的了吗?
同时,我们还知道Replacer.ReplaceText函数有3个参数:即对x替换y为z。(如果不知道,可以参考文章《10万行30列数据乘上系数,能快一些吗?含“函数作为参数”的触类旁通方法》)。
所以,我们写一个也带3个参数的自定义函数:
这个函数其实挺简单,大致过程如下:
- 按通配符*号拆分(Text.Split)要替换的内容(y)得到分隔符(*号前为d{0},*号后为d{1});
- 对原始内容(x)按*号拆分得到的分隔符分别取分隔符之前(Text.BeforeDelimiter)和之后(Text.AfterDelimiter)的文本;
- 和要替换成的文本(z)连在一起。
函数写好后,我们回到前面替换步骤生成的公式里,将Replacer.ReplaceText改为自定义函数funReplaceStar,搞定!
如果我们经常要实现类似的替换,那我们就可以构造一个类似的函数,在需要进行替换的时候,按习惯进行替换值操作,然后再简单换一下步骤里的函数即可。
当然,这个函数并不完美,比如,如果要替换的内容为“*}”,即只要}之后的数据,那就可能出错:
因为Text.BeforeDelimiter或Text.AfterDelimiter函数的分隔符参数不能为空,那该怎么改进好呢?
很多朋友在问,有没有习题供练习?——这就是今天留给大家的题目了,关注公众号,发送“数据”获取源数据练起来吧,其中还有答案哦。