M函數(shù)有很多的用途,其中之一就是將數(shù)據(jù)處理流程定義成自定義M函數(shù),可以理解成將處理步驟「打包」。
在執(zhí)行從文件夾合并文件前需要對(duì)文件執(zhí)行一些固定操作(提升標(biāo)題等、刪除空行、空列、替換值)時(shí),可以先單獨(dú)對(duì)一份文件進(jìn)行清洗,然后將清洗流程定義成自定義函數(shù)。對(duì)其他文件的轉(zhuǎn)換操作就可以直接調(diào)用自定義函數(shù)一次性完成了。
假設(shè)一共有4個(gè)月的銷量數(shù)據(jù),現(xiàn)在需要將他們合并進(jìn)行匯總分析。
觀察1月份數(shù)據(jù),第1、2行加載到Power Query后將會(huì)顯示成null,需要通過(guò)篩選去掉,另外出于某種原因D列是空列,因此需要?jiǎng)h除。同時(shí)為了更好的分析各產(chǎn)品情況,我們需要將數(shù)據(jù)進(jìn)行逆透視處理。
每個(gè)月的數(shù)據(jù)都符合以上特點(diǎn),同樣需要?jiǎng)h除前2行、刪除D列、逆透視。
不使用自定義函數(shù)的話,可以選擇將?各月的數(shù)據(jù)分別執(zhí)行以上步驟,再追加合并。
但既然流程是重復(fù)的,那么在Power Query中就可以實(shí)現(xiàn)自動(dòng)化。
一、從文件夾
先執(zhí)行從文件夾合并數(shù)據(jù)
這里保留第 2 列文件名,因?yàn)槭纠形募藬?shù)據(jù)的月份。
展開(kāi)自定義列以后可以看到,每個(gè)月份的數(shù)據(jù)已經(jīng)包含在【Data】列里面了
這時(shí)候我們可以保留【Name】和【Data】列,同時(shí)將1月份的數(shù)據(jù)添加為新的查詢。
將1月份的數(shù)據(jù)添加為新的查詢,是為建立自定義函數(shù)提供處理樣本。接下來(lái)我們對(duì)1月份的數(shù)據(jù)進(jìn)行數(shù)據(jù)清洗操作,然后將這些操作「打包」成自定義函數(shù),方便重復(fù)調(diào)用。
二、應(yīng)用數(shù)據(jù)清理流程
接下來(lái)在新生成的查詢中,應(yīng)用數(shù)據(jù)清洗步驟:
經(jīng)過(guò)以上步驟,1月份的數(shù)據(jù)處理整體流程就完成了。從視圖>高級(jí)編輯器中可以看到整個(gè)流程所產(chǎn)生的M代碼
三、定義函數(shù)及調(diào)用
接下來(lái)只需要將1月份數(shù)據(jù)處理的流程定義成函數(shù)進(jìn)行調(diào)用即可。
自定義函數(shù)的第一步是:在let 語(yǔ)句前方輸入定義參數(shù)的語(yǔ)句:
(DataTable)=>
找出參數(shù) DataTable 能替代的地方,將之前的步驟刪除,并用變量名替代之前的M代碼部分。修改后的M代碼如下:
(DataTable)=>
let刪除的頂端行 = Table.Skip(DataTable,2),提升的標(biāo)題 = Table.PromoteHeaders(刪除的頂端行, [PromoteAllScalars=true]),更改的類型 = Table.TransformColumnTypes(提升的標(biāo)題,{{"客戶編號(hào)", Int64.Type}, {"堅(jiān)果", Int64.Type}, {"毛巾", Int64.Type}, {"Column4",typeany}, {"沐浴露", Int64.Type}, {"巧克力", Int64.Type}, {"收納盒", Int64.Type}, {"水杯", Int64.Type}, {"糖果", Int64.Type}, {"洗潔精", Int64.Type}, {"洗衣液", Int64.Type}}),逆透視的其他列 = Table.UnpivotOtherColumns(更改的類型, {"客戶編號(hào)"},"屬性","值")
in? ? 逆透視的其他列
這里我們對(duì)所有月份數(shù)據(jù)的處理是從刪除頂端行開(kāi)始的,所以刪除的頂端行之前的步驟都可以刪除。并將 Table.Skip 函數(shù)的第一個(gè)參數(shù)改為變量名 DataTable。
點(diǎn)擊確定,可以看到對(duì)1月數(shù)據(jù)處理的流程已經(jīng)被轉(zhuǎn)變成了函數(shù),函數(shù)名為【Data】。
在查詢中通過(guò)自定義列調(diào)用 Data 函數(shù)提取1-4月份數(shù)據(jù)。
最后展開(kāi)【自定義】列,刪除【Data】列,提取【Name】列的日期數(shù)據(jù)即可。