Excel Power Query — 學習筆記(05)

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 | 科技 |