Power Query 系列 (05) - M 語言介紹
- 2019 年 10 月 4 日
- 筆記
M 語言或者叫 M 查詢語言是 Power Query (簡稱為 PQ) 幕後的英雄。據說 Power Query Editor 可視化操作可以實現 PQ 80% 的功能,所以從操作層面來說,大部分人不用學習 M 語言,但學習和掌握 M 語言無疑是在數據處理的時候如虎添翼,而且,有一些 M 的基礎也能加深對 PQ 操作步驟的理解,進而有可能對這些應用的步驟做一些優化和改善。總的來說,M 是一種值得學習和掌握的技能,Excel 和 Power BI 都可以用。
創建空查詢 (blank query)
前面我們都是連接外部數據源,然後雙擊 Excel Sheet 右邊的查詢名稱進入Power Query查詢編輯器,今天介紹如何通過創建一個空查詢的方法進入查詢編輯器。有兩種方法創建空查詢:
- 方法一:切換到【數據】選項卡,然後通過【獲取數據】- 【自其他源】- 【空白查詢】的方式,Excel 創建一個空白查詢,打開並進入到Power Query 查詢編輯器。
- 方法二: 先通過【獲取數據】- 【啟動 Power Query 查詢編輯器】進入到Power Query 查詢編輯器介面,然後在編輯器介面中創建空查詢。

高級編輯器
M 語言程式碼在進入查詢編輯器後,【主頁】和【視圖】兩個選項卡,都有「高級編輯器」按鈕,點擊即可進入。對於空查詢來說,進入後的介面是下面這樣:

本篇我們就將通過這個高級編輯器,來了解 M 語言的基礎知識。我們假設讀者已經有其他程式語言的概念,如果沒有其他程式語言的使用經驗,建議參考其他文章或書籍了解一下程式語言的概念,比如變數,語句,程式語言的結構等等。
let 語句
個人理解,let 語句的主要作用是配合 PQ 編輯器,方便看到查詢中的每一個步驟的公式和結果。比如,我們寫在高級編輯器中寫一個簡單的語句:

點擊完成按鈕,編輯器顯示如下:

在右邊應用的步驟中,編輯器把 a、b 和 result 都當做一個步驟,點擊其中的某一個步驟,中間的公式欄 (Formula bar) 分別顯示出這一個步驟的公式。
let 語句可以很複雜,但我這個理解應該不會有太大的問題。
標識符命名規範
Power Query M 是一種格式自由,但區分大小寫的語言,所以標識符命名也要區分大小寫,除此之外,其他限制比較少:
- 以非數字、非符號開頭(下劃線 (_)除外),可以是字母或漢字
- 名稱中只能用下劃線(_)和點(.)進行分割,如果標識符中出現其他的符號,在標識符前加上
#符號,比如#year/month
數據類型
理解 M 語言,應該從數據類型開始。M 的數據類型可以分為基本類型和容器類型,基本類型的分類如下:

Text (文本)
M 語言的 Text 用雙引號來引導,比如
"Hello World"
因為 M 的 Text 只能用雙引號引導,如果 Text 中含有雙引號的時候,需要在雙引號前面再加上一個雙引號,與 VBA 相同。比如要想表達:Tom said: "I love playing football very much",這句話包含兩個雙引號,在 M 語言中變成了:
result = "Tom said: ""I love playing football very much"""
結尾處,因為 Text 本身需要雙引號來包含,所以 much 後面的雙引號還有兩個雙引號,看起來真是令人混淆。
M 語言有三個轉義字元(escape sequence)
-cr: Carriage Return -lf: Line Feed -tab: Tab
如果在 Text 中需要換行,tab 鍵等,用 #(escape_sequence) 來表達。比如:
"Hello#(tab)Alice" "Hello#(cr)#(lf)World"
一個換行,竟然要用兩個 # 號,為了簡化,連續的轉移字元可以下面這樣表示:
// 與 "Hello#(cr)#(lf)World" 相同 「Hello#(cr, lf)World」
文本之間用 & 連接:
let count = 5, result = "You have " & Text.From(count) & " times left" in result
M 語言在進行文本連接的時候,並不能隱式轉換 (implicit conversion)。數字可以用 Text.From() 函數轉換為文本。
Number
數字字面量可以是 10 進位,也可以是 16 進位。以下是一些數字表示的示例:
5 // 整數 0 0.5 // 小數 1.5e+8 // 指數形式 1.6e-6 1.6E-6 // e 可以大寫或者小寫 .5 // 合法省略小數點 0xff // 16 進位, 字母可以大寫或者小寫 0XFF
特殊數字
M 語言中有如下幾個特殊數字:
#infinity // produced by an expression like 1/0 #nan // produced by an expression like 0/0 -#infinity // produced by an expression like -1/0
日期類型知識點比較多,單獨放一篇吧。