今日内容:Power Query中关于替换功能
在Power Query中提供了强大替换函数与功能。可以通过M公式对table,lsit以及record中的内容进行替换。
本期内容主要讲解Power Query中关于替换的函数Table.ReplaceValue函数。案例的主要来源于微信里关于Power Query的一个案例。
如上图所示,将左侧的数据替换成右侧的数据。即将左侧的学科列的“算术”与“数数”的内容替换成“数学”。
如果通过Power Query中的鼠标操作的方法,可以使用【转换】选项卡下中的替换值的内容,分别进行两次替换成想要的内容。如图所示:
再执行一次上面的步骤即可完成所有的替换。再看一下上面的步骤生成的公式:
替换1 = Table.ReplaceValue(源,"算术","数学",
Replacer.ReplaceText,{"学科"}),
替换2 = Table.ReplaceValue(替换1,"数数","数学",
Replacer.ReplaceText,{"学科"})
虽然可以将上面的两个公式嵌套到一起去,但是还是显得十分地麻烦与冗长。
再来查看一下关于Table.ReplaceValue函数的语法:
function (table as table,oldValue as any,newValue as any,
replacer as function,columnsToSearch as list) as table
从上面的该函数的语法可以看出,输出的结果为一个表,第一个参数是一个table,也就是源是一个表,要替换的内容为any,可以是任意类型,替换后的类型也是一个any,第4个参数比较有意思的是一个function,也就是说第4个参数可以是无限扩展的。在上面的通过鼠标操作的生成的第4个参数是一个替换器Replacer.ReplaceText。那么不考虑这个替换器,在手工书写M的时候还可以自己构造一个函数做为替换器。
故上面的替换的两个步骤可以写成一个公式,即:
= Table.ReplaceValue(源,{"算术","数数"},"数学",
(x,y,z)=>if List.Contains(y,x) then z else x,{"学科"})
这个公式很有意,也十分地巧妙。但是对于初学者来说,该公式中定义的第4个参数为一个function,理解起来不是特别地好理解。
上述公式中的x指的是当前的操作的行,y为要替换的list列表,即:{"算术","数数"},而z为替换后的新值。所以这三个值都是变量。
List.Contains(y,x)这一部分是判断当前的学科的值是否在y中被包含,List.Contains是按y的类型来决定的,返回的结果逻辑值,如果包含,那么返回TRUE,否则返回FALSE。如:第2行中学科的值为“算术”,为上述公式中的x,判断y中是否包含x,即“算术”是否在list列表{“算术”,“数数”}中出现过,而“算术”正好出现过,所以结果为TRUE。
再根据IF函数来判断,如果List.Contains的结果为TRUE,则返回结果为“数学”,如果为FALSE,也就是说不包含时,返回结果为当前的学科的值。
在Power Qeury中的M公式中,经常会出现的一个条件判断语句:
if …… then …… else ……
除此之外,还有一个与之相匹配的的语句,也叫容错语句。类似于Excel中的iferror函数。
try …… otherwise ……
需要注意的是这两个语句都是小写的形式,一定要注意。