學習Json檔案格式與實作系列:(3/5)Power Query的容器

Power Query在處理資料、解析資料的基礎上,並不僅僅是針對文字、數值、日期與時間等類型的資料而已,資料結構中的資料表、資料欄位、資料記錄,也都有其對應的儲存體,我們稱之為容器。在Power Query的資料結構中,會涉獵到資料表(Table)、記錄(Record)、清單(List)等容器,更是儲存與擷取結構化資料的重要元素,若要了解資料的深化、探勘、萃取、轉換、…等技巧,就必須深入了解這三大容器的關係、轉換、編碼與相關函數的運用。雖說使用Power Query操作介面與功能選單,就可以達到資料查詢的目的,但多方瞭解這些容器的標示方式,將有助於您再匯入JSON、XML等資檔案時,會有莫大的助益。

在Power Query的查詢結果中,資料表格(Table)的架構上,橫向的資料列是稱之為一筆筆的Record(資料記錄)、縱向的資料欄位則是稱之為一個個的List(清單)。而Table、Record、List即儲存著行列架構的資料內容,正是M語言的三大重要容器,若要以物件導向的觀念來看,這三大容器也都是物件。

因此,當您使用Power Query匯入外部資料檔案時,在轉換成結構化資料後,最常見的查詢結果就是這些內容。而Power Query亦會自動辨別匯入的資料,套用適當的資料型態(Data Type)或稱之為資料型別或資料行型態(Column Type)。

這在每一個資料行名稱的左側圖示可以看出端倪。例如:[ABC]是代表文字(Text)資料型態、[123]是代表整數(Whole Number)資料型態、[1.2]是代表實數(Decimal Number)資料型態。若想要在Power Query查詢編輯器裡進行資料型態的變更,只要點按該資料行名稱左側圖示,從可從展開的下拉式選單中點選而套用。

List(清單)

若比擬於Excel工作表或者資料庫裡的資料表,Power Query的List(清單)如同是垂直方向的資料欄。在Power Query裡是使用一對大括號{}來表示List,而List裡的元素可以是Number(數字)、Text(文字)、List(清單)、Record(記錄)、Table(資料表)等資料型態的內容。在建立與描述List裡的元素時,元素彼此之間要以逗點分隔。例如:

={2,5,9,11,6,5,3,10,30}

這是一個包含了9個元素,且都是數值資料的List。以下其他諸如以下的寫法,都是建立List的概念:

={1,2,3,7,8,9}

={"蘋果","柳丁","葡萄","鳳梨","火龍果","香蕉"}

={{1,2,3,7,8,9},{125,256,345,285,420,186},{88,66,102,94,70,58}}

={{新竹,台北,高雄,桃園,新北市,屏東},{"蘋果","柳丁","葡萄","鳳梨","火龍果","香蕉"},{A級,B級,C級,C級,B級,A級}}

={{240,108,132,97,86,49},{"蘋果","柳丁","葡萄","鳳梨","火龍果","香蕉"}}

看看這樣的描述,Power Query的List(清單),是不是雷同JSON資料格式中的陣列呢!只是JSON資料格式中的陣列符號是一對大括號,但放心,Power Query會自動識別與轉換的。而在Power Query的操作環境裡,亦提供有清單轉換為表格的功能選項,這在處理資料傳換成RAW DATA時是非常重要的。

Record(記錄)

瞭解了Power Query的List(清單)結構、語法與特性後,就來談談另一個Power Query容器:Record(記錄)囉!就像是Excel工作表橫向的資料列,在資料表的結構上,橫向便是一筆一筆的資料記錄。在Power Query裡是使用一對中括號[]來表示一筆資料記錄。藉由欄位名稱與欄位值來表達該筆資料記錄的內容,而欄位與欄位之間,則以逗點作為分隔符號。每一個欄位資料的內容,則是由一個等式來敘述,等號的左邊是欄位名稱,也就是資料行名稱,等號的右邊則是該欄位的值。欄位名稱兩側不需要雙引號,但是若欄位的值是文字資料,則必須要加上一對雙引號。因此,一筆Record(記錄)的基本撰寫語法為:

[欄位1名稱=值, 欄位2名稱=值, 欄位3名稱=值,…]

例如,建立一筆資料記錄:

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

大家看出端倪了嗎?這不正是我們談論過JSON的物件,其「鍵值對」(Key-Value Pairs)所組成的無序集合之表達嗎?,若集合裡有多組「鍵值對」,則彼此之間用逗號分隔,最外圍則以大括號 {} 包裹。而「鍵值對」裡的鍵(Key)是字串,值(Value)可以是字串、數字、布爾值、null、物件或陣列。例如:

{
 "姓名": "楊佑臻",
 "年齡": 30,
 "會員": false
}

而在Power Query的M語言中,就可以寫成:

= [姓名="楊佑臻",年齡= 30,會員= false]

至於多筆資料記錄的表示時,可參考如下圖所示,比較一下JSON格式的寫法,以及對應到Power Query傳換後的M語言標示方式:

您看,以後在操作Power Query時,總是難免會看到這些符號、這些標示方式,看完這系列文章後,您不但不會覺得奇怪,處理資料轉換工作肯定會更上手。相信即便不是資訊科技出身的您,一定還會覺得很有成就感吧!

Power Query所論及的Table(表格)指的資料表(Data Table),可不是一般Word繪製的表格喔!這是縱向行(Column)和橫向列(Row)結構所組成一系列二維陣列資料結構(Array Data Structure)的集合,是資料庫(Database)的主要儲存元件。匯入外部資料至Power Query查詢編輯器環境,即是資料表形式的查詢結果。

Table(資料表)

Power Query的另一個容器為Table資料表,除了匯入外部資料可以建構出資料表格式的RAW DATA外,在查詢編輯器裡也可以利用M語言的#table函數,輕鬆建立一個資料表,其語法為:

#table(columns as any, rows as any) as any

其中第1個參數columns是資料行名稱(也就是欄位名稱),以List架構來撰寫,而第2個參數rows也可以是List的結構,List裡的每個項目元素便是包含資料表裡的各欄位名稱,以及每一筆資料列的各欄位內容。例如:

單欄且單一儲存格的表格,若表示時薪為757元,則可以寫成:

=#table({"時薪"},{{575}})

如果所建立的Table是三個資料行,也就是包含三個資料欄位(時薪、姓名、工時)的1列資料(575、李妍嬪、82),則建立此表格的M語法為:

=#table({"時薪","姓名","工時"},{{575,"李妍嬪",82}})

若要建立多欄多列的資料表,例如延續剛剛的實作內容,可以撰寫出三個資料欄位、3筆資料列的表格:

=#table({"時薪","姓名","工時"},{{575,"周育昇",82},{765,"歐陽志成",82},{575,"楊佑臻",82}})

 

系列文章

(1/5) 物件的概念與結構 
(2/5) 再談JSON的架構  
(3/5) Power Query的容器  
(4/5) Power Query匯入Json實務範例1  
(5/5) Power Query匯入Json實務範例2