【M语言探秘】:掌握Power Query核心编程,编写高效数据查询脚本
发布时间: 2024-12-14 07:36:10 阅读量: 89 订阅数: 73 


汇编语言探秘:直击机器核心的编程艺术.md

参考资源链接:[Power Query教程:从入门到深度开发](https://wenku.csdn.net/doc/6412b75bbe7fbd1778d4a016?spm=1055.2635.3001.10343)
# 1. Power Query简介与M语言概述
## 1.1 Power Query的发展历程
Power Query最初作为Microsoft Excel的插件发布,名为“Get & Transform”,它为Excel用户提供了强大的数据导入和数据转换能力。随着时间的推移,Power Query演变为Power BI中不可或缺的数据转换工具,并被整合到Excel 2016及更高版本中。它支持多种数据源,包括CSV文件、Excel工作簿、数据库以及在线服务等,并提供了一种名为M的查询语言,让数据处理变得更加灵活和强大。
## 1.2 M语言的基本概念
M语言(也称为“M”或“Power Query Formula Language”)是一种专门用于Power Query的数据转换与数据建模的声明式语言。M语言与SQL等命令式语言不同,它专注于描述用户希望获得的结果,而不是具体如何获得这些结果。通过使用M语言,用户可以创建数据转换过程,这些过程可以被应用于原始数据以生成报表和数据模型。
## 1.3 M语言的使用场景
M语言的主要应用场景包括数据预处理、数据清洗、数据集成和数据转换。它允许IT专业人员和数据分析师通过一系列的步骤来准备和转换数据,以便于后续分析和报告。使用M语言可以将重复的数据转换任务自动化,提高数据处理效率,同时减少人为错误。例如,在处理从不同数据源导入的数据时,M语言可以用来统一日期格式、转换数据类型、计算新列以及过滤掉不需要的记录等。这种自动化和声明式的特性使得M语言在处理大数据集时尤为有效。
# 2. M语言基础语法与操作
### 2.1 M语言的数据类型和结构
M语言是一种用于Power Query中的函数式编程语言,与Excel中的VBA不同,M语言更注重声明式编程。在开始编写M语言代码之前,需要对数据类型和结构有充分的理解。熟悉M语言的数据类型和结构,可以有效提高代码的可读性和运行效率。
#### 2.1.1 常见数据类型
M语言支持多种数据类型,包括但不限于数字、文本、日期、时间、布尔值、记录、列表和函数等。每种类型都有其特定的使用场景和操作方法。
- **数字(Number)**:用于存储数字,包括整数和浮点数。
- **文本(Text)**:用于存储字符序列,如字符串。
- **日期和时间(Date/Time)**:用于表示日期和时间。
- **布尔值(Logical)**:表示真(true)或假(false)的值。
- **记录(Record)**:类似于其他编程语言中的对象或结构体,包含多个字段,每个字段有名称和值。
- **列表(List)**:有序的集合,可以包含任何类型的数据,但通常列表中的元素类型相同。
代码块可以展示如何在M语言中创建和操作这些基本数据类型:
```m
// 创建数字类型的变量
let
numberVariable = 123
in
numberVariable
// 创建文本类型的变量
let
textVariable = "Hello, Power Query!"
in
textVariable
// 创建日期时间类型的变量
let
dateTimeVariable = #datetime(2023, 4, 1, 10, 30, 0)
in
dateTimeVariable
// 创建布尔值变量
let
logicalVariable = true
in
logicalVariable
// 创建记录类型的变量
let
recordVariable = [FirstName="John", LastName="Doe", Age=30]
in
recordVariable
// 创建列表类型的变量
let
listVariable = {1, 2, 3, 4, 5}
in
listVariable
```
在上述代码块中,变量被创建并赋予了不同的数据类型。之后可以使用这些变量进行进一步的操作和函数调用。
#### 2.1.2 记录和列表的操作
在M语言中,记录和列表是数据操作的核心。对这些数据结构的操作通常需要理解它们的构造、访问以及更新方式。
- **记录的构造和访问**:记录由名称和值组成的键值对集合。访问记录中的值可以通过点标记法或者通过`[字段名]`的语法进行。
- **列表的构造和访问**:列表则通过花括号`{}`来定义,并且可以使用`{索引}`的方式访问其中的元素。
列表和记录操作示例:
```m
// 记录的创建与访问
let
person = [FirstName = "Alice", LastName = "Smith", Age = 25],
firstName = person.FirstName,
lastName = person[LastName]
in
{firstName, lastName}
// 列表的创建与访问
let
numbers = {1, 2, 3, 4, 5},
thirdNumber = numbers{2},
lastNumber = numbers{List.Count(numbers)-1}
in
{thirdNumber, lastNumber}
```
在上述示例中,我们展示了如何创建记录和列表,以及如何通过不同的方式访问其内部元素。这些基本操作是理解后续更复杂数据结构和函数的基础。
### 2.2 M语言的变量、函数与模块
M语言中的变量、函数和模块是构建复杂逻辑和实现代码模块化的重要基础。它们使得代码更加清晰,并且便于维护。
#### 2.2.1 变量的声明与使用
变量是编程的基础,用于存储数据值,以便在代码的其他部分引用。在M语言中,变量的声明和使用很简单。`let...in`结构是声明变量的常用方式。
```m
let
variableName = value,
result = variableName + value
in
result
```
上述代码块展示了如何声明一个变量`variableName`并使用它来计算`result`。
#### 2.2.2 函数的定义和高级特性
函数是将一组语句组织在一起,用来完成特定任务的代码块。在M语言中,函数非常灵活,支持参数默认值、可变参数等特性。
定义函数的语法如下:
```m
let
FunctionName = (parameter1, parameter2 as type, optional parameter3 as type) as returnType =>
functionBody
in
FunctionName
```
函数可以有返回类型,也可以没有返回类型。此外,M语言支持使用箭头函数进行简化。
高级函数特性示例:
```m
// 定义带有默认值的参数
let
multiply = (a as number, b as number, optional c as number = 1) as number =>
a * b * c
in
multiply
// 可变参数函数
let
concatenate = (textList as list) as text =>
Text.Combine(textList, ", ")
in
concatenate
```
在这些示例中,我们定义了一个带有默认值参数的函数`multiply`和一个可变参数函数`concatenate`。灵活使用这些高级特性可以大大增加代码的通用性和可重用性。
#### 2.2.3 模块化编程的概念与应用
模块化编程是将程序划分为独立模块的过程,每个模块都有其特定的功能。在M语言中,可以使用`module`关键字创建模块,这有助于将代码逻辑划分为可管理的部分,提高代码的可维护性和可读性。
模块化编程示例:
```m
// 定义模块
module MyModule
// 定义模块内的函数
let
addOne = (number as number) as number => number + 1
in
addOne
// 定义另一个函数
let
addTwo = (number as number) as number => number + 2
in
addTwo
end module
```
在本示例中,`MyModule`模块包含了两个函数`addOne`和`addTwo`。通过模块化,我们可以将相关功能组合在一起,使得代码结构清晰。
### 2.3 M语言的控制流语句
控制流语句用于控制程序中的语句执行顺序。M语言支持常见的控制流结构,包括条件语句、循环结构和错误处理机制。合理使用这些控制流语句可以提高代码的逻辑性和健壮性。
#### 2.3.1 条件语句的使用
条件语句允许基于条件表达式执行不同的代码路径。在M语言中,使用`if...then...else`语句来实现这一逻辑。
条件语句示例:
```m
// 使用if...then...else语句
let
number = 5,
result = if number > 10 then "大于10" else if number > 0 then "大于0" else "小于等于0"
in
result
```
在这个示例中,根据变量`number`的值,`result`将被赋予不同的文本描述。
#### 2.3.2 循环结构的实现
循环结构用于重复执行代码块,直到满足特定条件。M语言中的循环结构较少见,因为它更偏向于函数式编程。但可以使用递归或折叠(fold)操作来实现循环逻辑。
循环结构示例:
```m
// 使用递归实现循环
let
CountDown = (number as number) as text =>
if number > 0 then CountDown(number - 1) else "Zero",
result = CountDown(5)
in
result
```
上述示例中,`CountDown`函数通过递归调用自身来模拟倒计时,直到数字为零。
#### 2.3.3 错
0
0
相关推荐









