Excel Power Query — 學習筆記(05)
來自專欄 Power Query學習筆記
題記:
和大多數語言一樣,Excel PQ裡面的數據也是有類型和存儲結構的,但是它又不像數據結構那樣,棧/隊列/數組/鏈表/圖/樹/堆/散列表,那麼的豐富。一般M語言的數據是以序列/記錄/表(List/Record/Table)的形式儲存的,並且值(Values)有不同的類型(Type)。
(註:雖然對於概念,我是非常尊重官方文檔的,並且儘可能地直接引用官方文檔,但是這並不意味著,官方文檔的解釋就是最容易理解的,也不意味著官方文檔的案例可以在你電腦現行版本的Excel上實現。)(舉個例子)

這裡的let首字母大寫,你的編輯器是無法通過的。

Values
值在官方文檔中是被這樣解釋的:A single piece of data is called a value。(A value is data produced by evaluating an expression。)
感覺有點抽象?那我們來點具體的:
如果a=1,b=2,那麼表達式a+b的值是3;
如果a="Hello",b=" ",c="world!",那麼a&b&c的值就是「Hello world!」。
值又一般可以分為兩大類:原始值(Primitive values)和結構型值(Structured values)

有了值的概念,我們接下來就可以對值進行分類了:

1.M語言對數據的類型要求很嚴格,工作表裡面可以進行「強制轉換」(例如1+「1」=2),但是在M語言中會報錯,「+」無法應用於Number和Text之間。
2.Null這個概念有點像數學裡面的空集(?),很多人容易將?和{?}混淆,同樣,很多人會將Null和「」或者{Null}和{}混淆。Null是空,""是長度為0的字元串,這是不同的概念。
List/Record/Table
結構型值裡面有三大貫穿M語言使用的主角:List/Record/Table。
它們和上述的那些文本值/邏輯值/數值/時間值/二進位值等等相比有著非常大的區別。
1.序列(List)(為了和表Table進行區分,這裡不用列表進行表述)
從索引0開始,並使用大括弧「{ }」將一系列值括起來的有序序列;

從我給的定義中可以看到,list有索引,並且從0開始,因此也是有序性的:
索引有什麼用呢?
索引可以用來提取list中指定位置的值:
提取表達式——{a,b,c,……}{x} 表示提取序列{a,b,c,……}中索引為x的值。
和字元串一樣,我們可以求list的長度(對值的個數進行計數):
(M語言中有豐富的List函數,這裡暫時只介紹List.Count,學到函數時會講解)
如果list中的值也是list,那麼就形成了嵌套,嵌套可以進行連續提取值的操作:

工作當中,我們常常需要自己構建一個list,可能裡面包含大量連續的值,如果手動輸入,將是一件令人絕望的事,好在M語言提供了一種類似Python裡面range的快速構造list的方法:

(註:符合Unicode編碼順序,和ASCII碼的順序有出入)
2.記錄(Record)
用"[ ]"將成對的欄位名/欄位值括起來構成的無序信息組(Fileds);

看到這裡是不是發現我寫的無序信息組,但是官方文檔寫的ordered sequence,這裡並不是說有序/無序是錯的或者對的,主要是描述角度不一樣,list的有序性已經得到驗證,改變值的順序,list的值也會變化,那麼record呢?

無序性通過了M編輯器的驗證,也就是信息組的位置不影響record的值,基於值的角度,我說record是無序的;那麼官方說的有序序列ordered sequence如何理解?這裡不得不提前引入一個還沒講的構造table的方法:



當我輸入:
= #table( type table [Name = text,Digit = number], {{1,"one"}, {2,"two"}, {3,"three"}} )=#table( type table [Digit = number,Name = text], {{1,"one"}, {2,"two"}, {3,"three"}} )
時,結果是FASLE,在表裡面record充當了列標題的角色,而表裡面行和列都是有序的。
欄位名是標識符並且在一個record裡面是唯一的,記錄欄位(包含欄位名、欄位值)與欄位之間用半形逗號「,」隔開。
(標識符是獨立的值,例如「Hello,world!」就不可以做標識符,中間有逗號,這時我們需要使用構造標識符的方法——#"",見下面的例子)
Record的提取:[a=1,b=2,……][a]代表提取記錄中a欄位名所對應的值。
Record的嵌套:欄位值為記錄/序列時,就形成了嵌套。
嵌套的連續提取舉例:

3.表(Table)
表是一組被組織成行與列的值的集合。

如官方文檔所述,我們可以用#table來構造一個表:
1.#table({標識符},{序列});
2.#table(type table [records=types],{lists})。


如果我們使用方法2,但是沒有正確輸入type會報錯:

輸入了type,但是值的type對不上會正常顯示:

可見,構造表的方法1比較簡單,易於使用,方法2細節多一些,但是更加規範。
*當然,實際應用M語言時,table基本上是現成的,很少有需要你構造的場合。
(對於type知識點,實際用到的時候查詢文檔就好,專門展開講解性價比不高)
***表值的提取:
Table[欄位]{索引}或者Table {索引} [欄位])

表也是可以嵌套的,前面筆記中講解合併查詢的結果就是典型的表嵌套表,這裡不多贅述了。
下篇筆記:《運算符,注釋》
推薦閱讀:
※你用過哪些強大的快捷鍵?
※excel多個工作表求和sum用法?
TAG:MicrosoftExcel | PowerQuery | 科技 |








