M语言入门到精通:用Power Query编写自定义数据转换脚本
发布时间: 2024-12-28 15:33:07 阅读量: 8 订阅数: 10
Excel PowerQuery M函数 视频教程配套笔记及M函数大全.rar
![M语言入门到精通:用Power Query编写自定义数据转换脚本](https://poczujexcel.pl/wp-content/uploads/2022/12/dynamiczne-zrodlo-1024x576.jpg)
# 摘要
本文全面介绍了Power Query的高级应用,包括M语言的基础知识、自定义数据转换技术、高效数据查询技巧、与Power BI的集成,以及实际案例的分析。通过探讨数据类型和结构、基本操作、高级数据转换技术、自定义函数和数据模型、报告与可视化等关键概念,本文旨在为读者提供一套完整的Power Query使用指南和最佳实践。最后,文章还探讨了M语言的未来发展趋势和社区资源的作用,为开发者提供了持续学习和优化代码的途径。
# 关键字
Power Query;M语言;数据转换;自定义函数;数据模型;数据可视化
参考资源链接:[PowerQuery Excel自动化:高效数据导入与清洗指南](https://wenku.csdn.net/doc/7edu0mttve?spm=1055.2635.3001.10343)
# 1. Power Query简介与M语言概述
Power Query是微软Power BI数据集成引擎的一部分,它允许用户轻松地连接、合并和更新数据源,无需编写复杂的代码。它使用了一种名为M的语言来完成这些任务,M语言是一种专门用于数据转换和数据整合的编程语言。它的设计初衷是为了简化数据导入和准备的过程,提供一种直观和声明式的方式来描述数据转换逻辑。
在本章节中,我们将先初步探讨Power Query的工作原理,以及它在业务智能和数据分析中扮演的角色。然后,我们将转而了解M语言的基础知识,包括它的语法规则、函数库以及如何在Power Query中应用这些基础知识。通过这一章的学习,读者将获得使用Power Query和M语言进行初步数据处理的技能。
```mermaid
graph LR
A[开始使用Power Query] --> B[理解Power Query]
B --> C[学习M语言基础]
C --> D[探索M语言的高级功能]
D --> E[实践案例分析]
E --> F[最佳实践和未来展望]
```
如上图所示,我们将以一个循序渐进的方式,从基础到高级逐步深入探索Power Query和M语言。在开始之前,确保你的Power BI环境已经配置好,以便跟着步骤一起实践。
# 2. M语言基础知识
### 2.1 数据类型和结构
#### 2.1.1 理解M语言中的数据类型
M语言中,数据类型是构建任何表达式的基础。了解和掌握各种数据类型,对于有效地编写Power Query查询至关重要。在M语言中,基本数据类型包括数字、文本、逻辑值(true/false)、日期/时间以及null值。而复杂数据类型则包括列表(List)、记录(Record)、表(Table)和函数(Function)。
```m
// 示例代码块展示不同类型声明
let
num = 123,
text = "Hello World",
date = #date(2023, 4, 1),
isTrue = true,
nullValue = null
in
nullValue
```
上述代码声明了不同的基本类型和复杂类型,并将结果存储在变量中。理解每种类型的具体用途和如何操作它们是学习M语言的重要一步。例如,在处理表格数据时,通常会使用表(Table)类型,而在进行条件判断时则经常使用逻辑值(true/false)。
#### 2.1.2 探索记录和表的结构
在M语言中,记录(Record)是一种复杂数据类型,它代表一组命名的字段(field),每个字段关联一个值。而表(Table)则是由多行记录构成的集合,可以想象成电子表格中的行和列。通过理解记录和表的结构,你可以更有效地组织和处理数据。
```m
// 示例代码块展示记录和表的操作
let
record = [CustomerID = 1, Name = "John Doe", Sales = 1000],
table = #table({"CustomerID", "Name", "Sales"}, { {1, "John Doe", 1000}, {2, "Jane Smith", 1500} }),
// 添加新列到表
tableWithNewColumn = Table.AddColumn(table, "Profit", each [Sales] * 0.2)
in
tableWithNewColumn
```
在这个示例中,我们创建了一个记录和一个表,并向表中添加了一个新列。通过这种方式,我们可以很容易地扩展和自定义数据结构以满足特定的需求。
### 2.2 基本的M语言操作
#### 2.2.1 变量的声明与作用域
M语言支持在查询中声明变量,这些变量可以在查询的任何地方使用。声明变量的基本语法是使用`let`关键字,随后是变量赋值,最后以`in`关键字结束,后面跟着要返回的结果或表达式。
```m
// 变量声明与作用域的示例代码
let
// 在查询范围内的局部变量
localVariable = 10,
// 在整个M文件范围内可用的全局变量
globalVariable = let temp = 20 in temp * 2,
// 使用变量进行计算
result = localVariable + globalVariable
in
result
```
在这个例子中,我们声明了一个局部变量`localVariable`和一个全局变量`globalVariable`。变量可以嵌套在不同的作用域内,但需要注意的是,局部变量的使用范围限制在其声明的查询块内。
#### 2.2.2 常用函数与操作符介绍
M语言提供了一组丰富的函数和操作符,用于数据转换、文本处理、日期时间操作等。了解这些函数和操作符是进行高级数据操作的前提。
```m
// 常用函数与操作符的使用示例
let
// 文本连接函数
concatenatedText = Text.Combine({"Hello", " ", "World"}),
// 数字加法操作符
sumResult = 5 + 10,
// 日期格式化函数
formattedDate = Date.ToText(#date(2023, 4, 1), "yyyy/MM/dd")
in
{ concatenatedText, sumResult, formattedDate }
```
上述代码展示了文本连接、数字加法和日期格式化的操作。掌握这类操作能够帮助数据分析师快速进行数据的预处理和转换。
### 2.3 高级数据转换技术
#### 2.3.1 列的添加与删除
在数据处理过程中,经常需要添加新的列来存储计算结果或从现有列派生新数据。M语言中可以使用`Table.AddColumn`函数来添加新列。同样,如果需要删除列,可以使用`Table.RemoveColumns`函数。
```m
// 列添加与删除的代码示例
let
// 创建一个表
sourceTable = Table.FromRecords({[ID=1, Name="Alice"], [ID=2, Name="Bob"]}),
// 添加一个新列,计算每个记录的工资
addedSalary = Table.AddColumn(sourceTable, "Salary", each [ID] * 100),
// 删除一个名为"Name"的列
removedName = Table.RemoveColumns(addedSalary, {"Name"})
in
removedName
```
在上述示例中,首先创建了一个包含两个列的简单表格,随后添加了一个名为`Salary`的列,并使用`ID`列的值乘以100来填充。之后,我们删除了`Name`列。通过这种方式,可以灵活地管理表格结构,满足数据处理的需求。
#### 2.3.2 类型转换与错误处理
在数据转换过程中,可能会遇到数据类型不匹配的情况。此时,可以使用M语言提供的类型转换函数如`Value.NonNull`、`Value.ToText`等来解决问题。而错误处理可以通过`try...catch`语法来实现。
```m
// 类型转换与错误处理的代码示例
let
// 尝试将文本转换为数字,并捕获可能的错误
tryParseNumber = try Value.ToNumber("123"),
// 尝试将文本转换为数字,如果失败则返回null
tryParseNumberOrDefault = try Value.ToNumber("abc") otherwise null,
// 尝试将数字格式化为文本,如果输入不是数字则返回错误描述
formatNumberOrDefault = try Value.ToText(123) otherwise "Error: Input is not a number"
in
{ tryParseNumber, tryParseNumberOrDefault, formatNumberOrDefault }
```
在该代码示例中,我们演示了如何尝试将文本转换为数字,并处理潜在的错误。使用`try...catch`结构可以有效地防止查询失败,并允许更优雅地处理错误情况。
本章节为M语言基础知识部分,通过讲解数据类型、变量声明、常用函数以及数据转换技术,为读者打下了坚实的基础。在接下来的章节中,我们将逐步深入Power Query的实际应用,探索如何通过编写自定义函数来实现复杂的数据转换和整合。
# 3. 实现自定义数据转换
## 3.1 面向查询的设计模式
### 3.1.1 函数式编程基础
在Power Query的M语言中,函数式编程是一个强大的概念,它允许我们创建可重用的代码块来简化数据转换和整合的过程。函数式编程的核心是使用函数来解决问题,这在处理复杂的查询时尤其有用。函数可以接受输入参数,并根据这些参数产生输出结果,而不会对系统中的任何其他数据造成副作用。
下面是一个简单的M语言函数示例,展示了如何定义函数并使用它来转换数据。
```m
// 定义一个函数,输入一个数字,返回该数字的平方
square = (number as number) as number => number * number;
// 使用定义好的函数
result = square(5);
```
在这个例子中,我们创建了一个名为`square`的函数,它接受
0
0