M函数有很多的用途,其中之一就是将数据处理流程定义成自定义M函数,可以理解成将处理步骤「打包」。
在执行从文件夹合并文件前需要对文件执行一些固定操作(提升标题等、删除空行、空列、替换值)时,可以先单独对一份文件进行清洗,然后将清洗流程定义成自定义函数。对其他文件的转换操作就可以直接调用自定义函数一次性完成了。
假设一共有4个月的销量数据,现在需要将他们合并进行汇总分析。
观察1月份数据,第1、2行加载到Power Query后将会显示成null,需要通过筛选去掉,另外出于某种原因D列是空列,因此需要删除。同时为了更好的分析各产品情况,我们需要将数据进行逆透视处理。
每个月的数据都符合以上特点,同样需要删除前2行、删除D列、逆透视。
不使用自定义函数的话,可以选择将 各月的数据分别执行以上步骤,再追加合并。
但既然流程是重复的,那么在Power Query中就可以实现自动化。
一、从文件夹
先执行从文件夹合并数据
这里保留第 2 列文件名,因为示例中文件名包含了数据的月份。
展开自定义列以后可以看到,每个月份的数据已经包含在【Data】列里面了
这时候我们可以保留【Name】和【Data】列,同时将1月份的数据添加为新的查询。
将1月份的数据添加为新的查询,是为建立自定义函数提供处理样本。接下来我们对1月份的数据进行数据清洗操作,然后将这些操作「打包」成自定义函数,方便重复调用。
二、应用数据清理流程
接下来在新生成的查询中,应用数据清洗步骤:
经过以上步骤,1月份的数据处理整体流程就完成了。从视图>高级编辑器中可以看到整个流程所产生的M代码
三、定义函数及调用
接下来只需要将1月份数据处理的流程定义成函数进行调用即可。
自定义函数的第一步是:在let 语句前方输入定义参数的语句:
(DataTable)=>
找出参数 DataTable 能替代的地方,将之前的步骤删除,并用变量名替代之前的M代码部分。修改后的M代码如下:
(DataTable)=>
let删除的顶端行 = Table.Skip(DataTable,2),提升的标题 = Table.PromoteHeaders(删除的顶端行, [PromoteAllScalars=true]),更改的类型 = Table.TransformColumnTypes(提升的标题,{{"客户编号", Int64.Type}, {"坚果", Int64.Type}, {"毛巾", Int64.Type}, {"Column4",typeany}, {"沐浴露", Int64.Type}, {"巧克力", Int64.Type}, {"收纳盒", Int64.Type}, {"水杯", Int64.Type}, {"糖果", Int64.Type}, {"洗洁精", Int64.Type}, {"洗衣液", Int64.Type}}),逆透视的其他列 = Table.UnpivotOtherColumns(更改的类型, {"客户编号"},"属性","值")
in 逆透视的其他列
这里我们对所有月份数据的处理是从删除顶端行开始的,所以删除的顶端行之前的步骤都可以删除。并将 Table.Skip 函数的第一个参数改为变量名 DataTable。
点击确定,可以看到对1月数据处理的流程已经被转变成了函数,函数名为【Data】。
在查询中通过自定义列调用 Data 函数提取1-4月份数据。
最后展开【自定义】列,删除【Data】列,提取【Name】列的日期数据即可。