Power Query三大容器實作系列 - (8/8) 細說探索容器裡指定內容的M語言

Drill Down,常被翻譯或解讀為深層探究、向下鑽取、深入探索、向下切入、…這描述與形容我都覺得很傳神,也很有意境。在層層疊疊嵌套式結構化資料的架構中,由廣入深的探究底層的資料與有用的訊息,正是資料分析與探勘的必要手段。(系列文章實作練習下載)

清單(List)容器裡的元素

正如同先前談過的清單索引問題,也就是清單裡的各個元素都有其索引值,而索引值是由0開啟算起,因此,對於以下的清單(List)結構:

mylist = {25,100,"士林",999,"北投"}

若要萃取出此清單的第2個元素,則可以撰寫如下的M語言:

secondElement = mylist{1};

記錄(Record)容器裡的欄位值

至於記錄容器(Record)結構的資料,由於在中括號內,是一個個對應的欄位名稱與欄位內容,如下所示的範例:

rec =[工號="E9002",姓名="林美如",工時=87,時薪=650]

所以,當您要擷取出此記錄裡的某一欄位內容就更明確了,只要在記錄名稱右側用一對中括號表達欄位名稱即可。例如,以下的撰寫便可傳回工時欄位的內容值:

工時內容 = rec[工時]

資料表(Table)容器裡的內容

資料表(Table)是屬於欄列交錯的資料結構,縱向是資料行,或可稱資料欄位;橫向則是一筆筆的資料記錄。資料表的內容可以是一般的文字、數值、日期、邏輯、…等型態的資料,也可以是清單(List)、記錄(Record)、資料表(Table)具備結構化的資料內容。例如:以下的資料表名為「員工資料」:

在Power Query的環境裡,若要擷取這一張資料表結構的局部內容,例如:取得第3個資料記錄的內容,則M語言的表達方式是:

= 員工資料{2}

因為Power Query物件的索引編號都是從0算起,因此「員工資料{2}」的意思是取出「員工資料」資料表裡的第3筆資料記錄,而傳回的查詢結果則是以記錄(Record)資料型態呈現。

所以,若要擷取第一筆資料記錄,則可輸入以下程式碼:

= 員工資料{0}

記錄裡的「基本個資」欄位也是Record資料型態,因此,若要再向下切入擷取此欄位內容,則可以輸入以下程式碼:

= 員工資料{0}[基本個資]

查詢結果顯示此欄位裡包含了3個資料欄位及內含值,分別為「性別」「男」、「年齡」「38」、「學歷」「碩士」。

記錄裡還有名為「眷屬」的欄位,則是屬於Table(資料型態)的資料型別,因此,若輸入以下程式碼:

= 員工資料{0}[眷屬]

則傳回的查詢結果是一張資料表,表示員工資料裡的第1筆資料記錄(索引編號為0)其眷屬資料表。

至於若需要從此資料再向切入,擷取該眷屬資料表的第4筆資料記錄,則修改一下上述的M語言程式碼如下:

= 員工資料{0}[眷屬]{3}

後面加上{3}即表示要取出該資料表的第4筆資記錄,也就是該名員工的眷屬中第4位眷屬的資料記錄,最終的查詢即果為3歲的長女孫莉美。

依此類推,針對此範例的資料內容執行如下的程式碼,相信您應該可以很容易解讀,可以擷取「員工資料」的第1位員工資料記錄其「興趣」資料欄位的內容,而此內容的查詢結果是清單(List)的容器。

= 員工資料{0}[興趣]

展開容器

例如,透過下述程式碼,匯入了講師勞務報酬資料(三區名冊).xml檔案:

= Xml.Tables(File.Contents("F:\講師勞務報酬資料(三區名冊).xml"))

由於此XML檔案裡定義了三張資料表,並嵌套於頂層結構,因此,匯入時有兩個資料行,分別命名為Name和Table,共計3筆資料記錄,而Table資料行的內容正各區域講師名冊的資料表內容,我們可以透過展開各個資料表的操作來達成彙整資料表的目的。

在展開的功能選單中,取消[使用原始資料行名稱做為前置詞]核取方塊,讓展開的資料行名稱更為簡潔。

資料的展開是透過Table.ExpandTableColumn()函數來完成,此例的M語言程式碼為:

= Table.ExpandTableColumn(來源, "Table", {"Name", "Table"}, {"Name.1", "Table.1"})

此函數的第1個參數是原始資料來源;第2個參數使來自原始資料來源裡的哪一資料行需要進行展開的作業;第3個參數則是清單(List)結構,描述要展開的資料表裡其資料行名稱列表;至於第4個參數也是清單(List)結構,描述要展開資料表後的新資料行名稱列表。

此例中的原始資料來源原本就有兩個資料行:Name及Table,而Table資料行的資料型態是Table容器,展開後,每一個Table容器裡的資料表又包含Name及Table兩個資料行,因此,展開後的資料會將這兩個新資料行,分別命名為 Name.1 和 Table.1,以避免與原始資料表中的資料行名稱發生衝突。

在完成展開後,新的Table.1資料行的資料型態也是Table容器,因此,我們可以再度點按其展開按鈕,繼續向下探勘。

同樣的道理,在展開的功能選單中,仍是取消[使用原始資料行名稱做為前置詞]核取方塊,讓展開的資料行名稱更為簡潔。在此刻也可以看到,展開後的資料表將包含了「編號」、「日期」、「講師」、「性別」、「業務所得」等5個資料行。

完成資料的向下切入後,完整的XML資料解析便呈現在您面前,只需再移除不需要的Name.1資料行,也適度的調整一下各個資料行的資料型態,例如「業務所得」資料行可以設定為整數型態,乃至將「日期」轉換成西元日期或其阿日期單位與維度,那就是一份完美的RAW Data了。

經過這一番操作,相信您對於在Power Query環境裡,進行查詢資料時,對清單(List)、記錄(Record)、資料表(Table)等容器的深入探索,應該要如何撰寫與編修M語言的程式碼一定是了然於胸,得心應手了。在此也結束此一系列的心得分享,後會有期囉!

 

Power Query三大容器實作系列