Table容器是Power Query中处理结构化数据的核心工具,也就是我们俗称的资料表(Data Table)。透过行、列方式储存资料,可以执行筛选、合併、转置等多样操作,满足数据清理与转换的需求。Table容器在资料整合中更扮演重要角色,可以整合多个来源数据,也是进行複杂分析的基础,能与Excel及Power BI无缝对接,支援枢纽分析、动态报表等。熟练掌握Table容器不仅能提升工作效率,还有助于应对多样化的数据分析需求,是了解与学习Power Query的关键一步。
Table(资料表格)
Power Query所论及的Table(表格)指的资料表(Data Table),是纵向行(Column)和横向列(Row)结构所组成一系列二维阵列资料结构(Array Data Structure)的集合,是资料库(Database)的主要储存元件。汇入外部资料至Power Query查询编辑器环境,即是资料表形式的查询结果。
使用M语法建立资料表
除了汇入外部资料产生资料表查询外,在Power Query查询编辑器里,也可以利用M语言的#table函数,轻鬆建立一个资料表。而#table的语法为:
#table(columns as any, rows as any) as any
其中第1个参数columns是资料行名称(也就是栏位名称),以List架构来撰写,而第2个参数rows也可以是List的结构,List里的每个项目元素便是包含资料表里的各栏位名称,以及每一笔资料列的各栏位内容。。
例如:
单栏且单一储存格的表格,若表示姓名为 陈小华,则可以写成:
=#table({"姓名"},{{"陈小华"}})
这是一个单栏单笔资料列的Table。
如果所建立的Table是三个资料行,也就是包含三个资料栏位(姓名、工时、时薪)的1列资料("陈小华",82,575),则建立此表格的M语法为:
=#table({"姓名","工时","时薪"},{{"陈小华",82,575}})
在预设状态下资料行都是any资料型态的查询结果。
若要建立多栏多列的资料表,例如延续刚刚的实作内容,可以撰写出三个资料栏位、4笔资料列的表格:
=#table({"姓名","工时","时薪"},{{"陈小华",82,575},{"李大同",74,846},{"黄玉琳",56,756},{"赵文丰",68,1024}})
Table里包含List
原本在资料表的设计上,如果栏位里的内容允许填入多项资料,而非只是基元值(Atomic Value),则该栏位的资料型态,若是设定为List容器,将是不错的选择。例如:一个资料表里要储存个人基本资料,包含[工号]、[姓名]与[专长],其中[工号]及[姓名]都设定为文字型态是颇为适宜的,而若一个以上的多项专长也都可以储存,则[专长]设定为List(清单)资料型态,应该也是不错的选择。以下我们就利用M语言程式编码的撰写,来建立一个Table里的资料栏位也包含List资料型态的範例。内容为3笔资料记录,3个资料栏位,其中[专长]资料行的内容是List。
工号 | 姓名 | 专长 |
EM092 | 李正华 | List(内容是:程式设计,音乐,绘画,Excel) |
EM094 | 黄梅如 | List(内容是:日文,舞蹈) |
EM095 | 邱政宽 | List(内容是:品管,法语,驾驶) |
程式编码如下:
=#table({"工号","姓名","专长"},{{"EM092","李正华",{"程式设计","音乐","绘画","Excel"}},{"EM094","黄梅如",{"日文","舞蹈"}},{"EM095","邱政宽",{"品管","法语","驾驶"}}})
在预设状态下资料行都是any资料型态,但是[专长]资料行的内容则是可以继续深入查询的List资料型态。
我想刚刚的程式码编输入,最头痛的应该就是括号的对应了吧!正如先前的学习与实作,这些多层次的大括号、小括号都有其意义,缺一不可,但是都连串撰写也实在难以阅读与检视,撰写时适度的按下Enter按键进行分行,不但有助于编辑也提高了可读性。
=#table({"工号","姓名","专长"},
{
{"EM092","李正华",{"程式设计","音乐","绘画","Excel"}},
{"EM094","黄梅如",{"日文","舞蹈"}},
{"EM095","邱政宽",{"品管","法语","驾驶"}}
}
)
Table里包含Record与Table
那么,上述两个查询其实也可以成为另一个查询内容喔!例如:再建立一个名为[员工名册]的查询,这也是一个Table资料型态的内容。共有5个资料栏位的表格,分别是[工号]、[姓名]、[基本个资]、[眷属资料]与[兴趣],其中,[工号]与[姓名]资料行都是文字型态的内容,而[基本个资]资料则描述着员工的个资,因此,可以建立Record资料型态的内容,以此例而言,藉由Record语法,建立[性别]、[年龄]与[学历]等3的资料栏位的记录。而[眷属资料]资料行是储存员工的眷属资料,是以资料表容器的格式呈现,且资料表包含了[姓名]、[称谓]与[年龄]等3个资料行。至于最后一个[兴趣]资料行则是List资料型态的内容。
此资料表的程式编码如下:
let
来源 = #table({"工号","姓名","基本个资","眷属","兴趣"}, {
{"E203","孙志勇",[性别="男",年龄=38,学历="硕士"],#table({"姓名","称谓","年龄"},{{"孙正德","父",62},{"赵蕙兰","妻",29},{"孙和庭","长子",6},{"孙莉美","长女",3}}),{"运动","阅读","摄影","旅游"}},
{"E205","李晓雯",[性别="女",年龄=52,学历="EMBA"],#table({"姓名","称谓","年龄"},{{"林月卿","母",77},{"李成桂","父",81},{"周孟隆","夫",55},{"周家豪","长子",23},{"周品妍","长女",21}}),{"音乐","游泳","绘画"}},
{"E206","萧尹文",[性别="男",年龄=46,学历="专科"],#table({"姓名","称谓","年龄"},{{"沈珊如","妻",47},{"萧胜宏","父",72},{"萧子晴","长女",18},{"冯咏晴","次女",18},{"萧承恩","长子",15}}),{"运动","健身","冲浪"}},
{"E208","冯怡君",[性别="女",年龄=28,学历="大学"],#table({"姓名","称谓","年龄"},{{"冯进财","父",58},{"林玉兰","母",50},{"冯冠廷","弟",25}}),{"瑜珈","园艺","烹饪","旅游","写作"}}
})
in
来源
全部容器都撰写在一起的叙述虽然没有多少行程式码,但阅读与除错并不容易。所以,有规则、有规律的分行、分段,调整成适度的查询步骤,程式码就必较容易维护。
从上述的实作练习一定可以让您体验到M语言的资料型态与三大容器List、Record与Table的特性及彼此的关係。基本上,在实务应用中我们并不太会亲自键入M语言程式编码来建立新的资料,而是从外部资料来源汇入需要处理、拆分、彙整、运算与清洗的大量资料与多方来源的异质性资料。而这些资料来源的资料型态与特徵,正如我们实作中所看到的这些资料库名词、图示、功能与处理基础,因此,相信在面临这些内容时您就有能力可以处理与面对。
Power Query三大容器实作系列
- <<Power Query三大容器实作系列 - (1/7) Power Query的资料型态>>
- <<Power Query三大容器实作系列 - (2/7) Power Query的三大容器>>
- <<Power Query三大容器实作系列 - (3/7) Power Query List的建立与编辑>>
- <<Power Query三大容器实作系列 - (4/7) 向下切入:深化(撷取)容器里的内容>>
- <<Power Query三大容器实作系列 - (5/7) – 关于List的索引值>>
- <<Power Query三大容器实作系列 - (6/7) Record(记录)的建立编辑与转换>>
- <<Power Query三大容器实作系列 - (7/7) Table(资料表格)的建立编辑与转换>>