功率查询是一个非常强大的数据提取和转换工具,进入Excel 2016(或更高版本),Excel Office 365和Power BI。
它可以在其中找到数据在功能区的Get&Transform数据部分中的选项卡。
它非常强大,也很容易使用,查询编辑器对Excel用户具有超直观的用户界面。可以从电源查询编辑器功能区轻松执行许多转换步骤,您不需要知道任何代码来清除和塑造数据。
在用户友好编辑器的幕后,Excel正在将转换过程中的每个步骤从那些带查询M代码语言转换为电源查询。
这篇文章将向你介绍电源查询M代码语言的基础知识,并假定你已经知道这些基础知识电力查询.
目录
什么是m代码?
的米代表数据米灰烬,因为电力查询都是关于连接各种不同的数据源,并“捣碎”它们。
M代码是后台语言的电源查询。当您在电源查询编辑器UI中创建数据转换时,Excel将为查询编写相应的M代码。
m是一种功能语言,意味着它主要用调用函数来评估和返回结果。M代码附带一个非常大的预定义函数库,您也可以创建自己的。
在哪里可以写电源查询M代码?
如果您想开始写作或编辑M代码,您将需要知道您可以在哪里进行。公式栏或高级编辑器中有两个地方。
公式栏
对于在编辑器UI中创建的每个步骤,您可以在公式栏中查看相应的M代码。
如果你没有看到公式栏,请转到看法标签并确保公式栏选项已选中。
您可以通过单击“公式”编辑查询中的任何步骤,并编辑现有代码。完成后,您可以通过单击复选标记或按下接受任何更改进入.您还可以通过单击X或按下来丢弃更改退出.
您还可以通过单击“使用公式栏在您的查询中创建完全新的步骤FX.公式栏旁边的符号。这将创建一个新步骤,该步骤通过名称引用前面的步骤,然后您可以创建所需的任何M代码。
高级编辑器
公式栏只显示查询中当前选择步骤的M代码,但在高级编辑器中,您可以查看和编辑整个查询的M代码。
您可以从编辑器带中的两个位置打开高级编辑器。从这两者之间家选项卡或看法标签按高级编辑器按钮。
尽管有“高级”的绰号,但这个编辑器是你将看到的最基本的代码编辑器,(目前)不包含任何智能感知自动完成、语法突出显示或自动格式化功能。
高级编辑器将显示查询名称,显示查询的M代码,并显示关于M代码中任何语法违规的警告。就是这样!
标准函数库
由于M代码是一种功能语言,这一切都是关于函数,而M代码附带一个名为标准库的大型预定义函数库。
有关所有标准库功能的信息可以在微软的电源查询M引用网页,包括函数语法和示例。
属性从电源查询编辑器中也可以探索标准库#共享关键字。
进入公式栏时,您可以通过单击单词来探索所有可用功能功能在函数的姓名右侧。您将发现与参考网页相同的语法和示例。
案例敏感性
在编写M代码时,有人需要知道的第一件事之一是它是一个区分大小写的语言。
这意味着x与x或“abc”不同的是与“abc”不同的东西。对于任何值,变量,功能等,这是正确的
电源查询中的表达式和值
电源查询是关于表达式和价值.
表达式可以评估以返回功率查询中的值。1 + 1是评估值2的表达式。
值是单一数据。值可以是单个值,例如数字,文本,逻辑,空,二进制,日期,时间,日期时间,datetimezone或持续时间。
值还可以具有比单个值更复杂的结构,例如列表,记录和表格。您还可以具有列表,记录和表的组合的值。列表列表,列表表,表格表等所有可能的值结构。
单个字面价值
单个文字值是所有其他值的基本构建块。
- 123.45是一个数值。
- “你好世界!”是文本值。
- 真的是一个逻辑价值。
- 无效的代表没有价值。
单个内在值
使用各种内在功能构建内部值。
- #Time(小时,分钟,秒)
- #日期(年、月、日)
- #datetime(年,月,天,时间,几分钟,秒)
- #datetimezone(年,月,天,时间,几分钟,秒,偏移时间,偏移量分钟)
- #duration(天,小时,分钟,秒)
例如,构建日期2018-12-31.您需要使用它使用的#date(2018,12,31)内在功能。
结构化值
清单
一个列表是一个有序的值序列。
可以使用花括号定义列表。{1, 2, 3}是一个包含数字1,2和3的列表。因为顺序很重要,所以这个列表与{3,2,1}不同。
{“Hello”,“World”}是包含文本“Hello”和“World”的列表。
也可以列出列表,因此{{1,2},{3,4,5}}是两个列表的列表。第一个列表包含数字1和2,第二个列表包含数字3,4和5。
您可以使用格式{x..y}创建顺序列表。{2..5}将生成列表{2,3,4,5}。这也适用于文本角色。{“a”..“d”}将产生列表{“a”,“b”,“c”,“d”}。
您还可以有一个没有项目的列表,{}是空列表。
由于订购了列表,我们可以使用一个列表中的项目引用基于零的索引数字。{1,2,3} {2}将评估为3,因为这是列表中的第二项(基于零索引)。
记录
一个记录是一个有序的序列领域.每个字段都包括一个字段名称哪个唯一标识该领域和一个字段值这可以是任何类型的值。
您可以使用Square括号定义一个记录。[FirstName =“John”,年龄= 38]
是一个有两个字段的记录。记录中的第一个字段具有FightName的字段名称和“John”的值。记录中的第二个字段具有字段名称和值为38。
记录的记录也是可能的,[人= [FirstName =“John”,年龄= 38]]
是一个字段的记录,一个字段具有字段名称和字段值,它是记录。
空记录也是可能的,[]就是空记录。
您可以通过其字段名称引用字段值。[FirstName =“John”,Age = 38] [FirstName]将评估为“John”。
桌子
一个桌子是一个有序的序列行每行是列表的地方。
表只能使用内在功能构造。您可以使用从列标题列表和行列表中使用#table()函数的表。
#table({“字母”,“数字”},{{“a”,1},{“b”,2},{“c”,3}})
将创建一个具有2列的表,3行和字母和数字列标题。
可以使用#table()内在函数中的空列表创建空表。#table({},{})将产生一个空表。
您可以使用基于零的行索引和列标题名称引用表中的任何值。#table({“字母”,“数字”},{{“A”,1},{“B”,2},{“C”,3}}){2} [字母]
将评估为“C”,因为这是第2行(基于零索引)字母列。
表达式
表达式是可以评估到值的任何东西。这本身就是如此。例如,表达式1评估到值1。
虽然您通常会将表达式视为由更复杂的运营或功能组成。
例如:
- 表达式1 + 1评估为2。
- 表达式3> 2评估为True。
- 表达“你好”和“世界”评估“你好世界”。
- 表达式的文本。Upper(“Hello World”)计算为“Hello World”。
运营商
除了标准库之外,M代码还有一个称为操作符的特殊函数列表。它们接受两个值(或计算为值的表达式)并返回单个值。
算术
M代码附带您预期的基本算术运算符,并用于常规Excel+,- - - - - -,*和/.这些将允许您分别添加,减去,多重和划分值。
这些可以与只有数字以外的各种其他类型的值一起使用。例如,您可以将持续时间添加到日期。
#date(2018,12,25)+ #duration(7,0,0,0)将评估为2019-01-01.
比较
您可以使用比较运算符进行M代码中的值<,>,<=,> =,=,<>.
- 如果x小于y,则x
- 如果x大于y,x> y会评估为true。
- 如果x小于或等于y,则x <= y将评估为true。
- 如果x大于或等于y,则x> = y将评估为true。
- x = y将评估为true,如果x等于y。
- 如果x不等于y,x <> y会评估为true。
这些可以与各种类型的值一起使用。例如,您可以将两个列表与等式操作符进行比较。
{1,2,3,4} = {1,2,3}将评估为错误的由于列表不一样。
连接和合并
您可以使用Ampersand连接文本和合并列表,记录和表格&
操作员。
例如:
“你好世界”
将评估为“Hello World”。
{1,2,3}&{3,4,5}将评估为{1,2,3,3,4,5}。
逻辑
属性可以对布尔值(或计算为布尔值的表达式)执行操作不是,和和要么运营商。
评论代码
正如您希望从任何编程语言所期望的那样,可以向您的代码添加注释。
在M代码中可能有两种注释类型。单行注释和多行注释。
单行注释
m代码去这里m代码进入这里//这是一个单行注释m代码在这里
可以通过在注释前面加上两个斜杠字符来创建单行注释//.在同一行上的任何东西都将被解释为M代码,任何内容都会被解释为评论。
多行评论
M代码在这里/*这是多行注释*/ M代码在这里
可以通过在介于之间进行评论来创建多行注释/ *和* /人物。在这些之外的任何东西都将被解释为M代码。这些之间的任何东西都将被解释为评论。
留言
的让语句允许评估一组值并分配给变量名称,然后在后续的后续表达式中使用在陈述。
设a = 1 b = 2 c = a + b
此表达式由三种表达式组成,该表达式在后面评估让陈述。每个表达式都被逗号分隔,除了最后一个之前在陈述。在这个例子中整个让和在表达式的值将为3。
让c = a + b,b = 2,a = 1
你可能会认为a中的表达让声明需要按照他们需要进行评估的顺序出现。不是这种情况!上面的代码非常有效,也将评估为3. M代码评估器将自动计算基于表达式依赖性所需的计算顺序。
如果M代码是按求值顺序编写的,那么它显然更容易阅读,但还有另一个好处。表达式将作为单独的步骤出现在“应用步骤”窗口中。如果没有按顺序写,这些表达式将作为一个组合步骤出现。
让a = 1,b = 2在a + b中
您还可以评估表达式在A的一部分让...进…表达。
变量名称
让#“这是一个变量名称吗?哇!!!”#1 + 1中的#“这是一个变量名称吗?哇!!!”
您可以使用它的表达式分配有关您的表达式的任何名称#“”人物。您甚至可以使用空格字符和其他特殊字符。使用保留关键字是唯一的例外。
变量名称是查询编辑器的应用步骤中的应用程序,因此能够使用空格字符是一个很棒的功能。
每个陈述
的每个表达式是声明函数以单个参数命名的函数_(下划线)。
让Source = #table({“数字”},{{1},{2},{3},{4},{5}}),#“添加自定义”= table.addcolumn(源,“double”,#“添加自定义”中的每个2 * [数字])
在此示例中,我们正在创建一个新列,每个列将数字列乘以每行2。
让Source = #table({“数字”},{{1},{2},{3},{4},{5}}),#“添加自定义”= table.addcolumn(源,“double”,(_)=> 2 * _ [数字])在#“添加自定义”中
我们可以使用下划线语法创建相同的查询,它在语义上等价于each语句。这两个查询的工作原理相同。
If Then Else语句
与逻辑表达式相比,与其他语言相比,M代码非常稀疏。没有可用的选择案例或循环语句。只有一个如果...那么......表达可用。
如果[逻辑表达式测试]那么[当真实]否则否则]否则[错误]
它的语法很简单,就像大多数其他编程语言一样。它可以显示在一行中,也可以显示在单独的行中,以方便阅读。
另外陈述
尝试执行需要特定类型数据的操作时可能会发生错误。例如,尝试将数字乘以文本值将导致错误。
让源= #table({“数字”,“编号和文本”},{{2,2},{2,“hello”}}),#“添加自定义”= table.addcolumn(源,“产品”,每个尝试[编号] * [编号和文本]否则为0)在#“添加自定义”中
通过使用避免错误试一试……否则……表达。
这将避免查询结果中的错误,并允许您替换任何值或表达式的错误。
功能
函数是从一组参数值到值的映射。随着标准库中的功能,M代码允许您创建自己的函数。
让产品=(x,y)=> x * y,结果=产品(2,3)
这个查询定义了两个数相乘的函数。然后查询调用函数并使用值2和3计算函数值6。
具有可选参数的函数
有两种类型的函数参数,必需参数和可选参数。
必需的调用函数时必须始终指定参数。
可选调用函数时不需要指定参数。如果缺少可选参数,则传递给函数的值将是无效的.
让产品=(x,可选y)=>如果y为null,则x eyl x * y,结果=产品(2)
此函数具有可选的第二个参数。然后,查询调用并仅使用具有2的值为2的所需参数来评估函数,这会评估为2.请注意,该函数需要解释为null的y,否则可能导致函数评估错误的函数.
递归函数
还可以使用使用的函数来指的是自身的@范围运营商。
让fibonacci =(n)=>如果n = 1那么如果n = 2那么为另外一个@fibonacci(n-1)+ @fibonacci(n-2),结果= fibonacci(7)
Fibonacci序列是递归定义的函数的示例。序列中的下一个数字定义为两个以前数字的总和。因此,要获得第n个号码,您需要知道(n-1)和(n-2)个数字。
此功能将通过添加(n-1)和(n-2)th fibonacci编号来找到第n个fibonacci编号。
查询评估为13,因为13是第7斐波纳契号。
下面是一些更有用的示例,您可以使用递归函数复制Excel的修剪功能删除单词之间的多余空间批量查找并替换基于列表的值.
查询功能
上面的示例在查询中定义了一个函数,然后调用并评估查询内的函数。
还可以创建一个函数(查询函数)的查询,并且可以从其他查询调用和评估。
让FunctionResult =(Argument1,Argument2,...)=>让/ * M代码在函数中评估此处* /导致ForkingResult
这是创建查询函数所需的常规格式。注意,您需要一个让...进…陈述中的声明让...进…查询函数的语句以执行多个步骤。
结论
功率查询是Excel中的一个很棒的功能,可以帮助您自动化和简化数据导入和转换。
只使用图形化的点和点击界面就可以做很多事情,而无需接触M代码。但是,随着您的需求变得越来越高级,可能需要编辑您创建的M代码,或者从头开始编写自己的M代码。
任何新的编程语言,如果不先了解基本知识,都是无法读懂的。本指南有望让你开始使用M代码,这样你就可以开始创建更高级的查询了。
好东西。我想从你那里了解更多关于m的信息。
谢谢Sand!保持调整更多。我将增加这篇文章。
好了约翰。
几周后,我还将在自定义M代码功能上写一些单独的帖子。
太好了。我也会小心的。
很棒的帖子,我正在为未来的参考标记它。感谢分享。
谢谢你大卫!很高兴你喜欢。
谢谢,约翰,这对我来说是正确的内容和水平。除此之外,我尝试过的一切:
{x..y}。{2..5}
它告诉我表情。SyntaxError: Token Eof expected。
而且我无法弄清楚出了什么问题!
有什么建议么?
创建自定义列并使用公式= {2..5}
这应该有效......如果你有{x..但}和x和y没有定义很可能是问题。
非常感谢!这正是我正在寻找的入门信息-真的很感谢它!
很高兴它帮助了乔!
谢谢你的分享。很棒的帖子,我保存下来学习
没问题!
谢谢。非常有帮助。
不客气,内森,很高兴有帮助!
M.很好地介绍M.我发现它非常有帮助。谢谢!
伟大的文章!给了我所需的背景,我需要开始探索更多。