Разное

M язык: Справочник по языку формул Power Query M – PowerQuery M

Знакомство с языком формул Power Query M – PowerQuery M

  • Статья
  • Чтение занимает 10 мин

Обзор

Microsoft Power Query предоставляет эффективный интерфейс получения данных, обладающий множеством возможностей. К ключевым возможностям Power Query относятся фильтрация и объединение данных, позволяющие комбинировать данные из одного или нескольких поддерживаемых источников данных из обширной коллекции. Для выражения всех подобных комбинаций данных используется язык формул Power Query (формально известный как язык M). С помощью Power Query можно внедрить документы M в широкий спектр продуктов Майкрософт, включая Excel, Power BI, Analysis Services, Dataverse и получить возможность повторяемого гибридного преобразования данных.

В этом документе содержится спецификация для M. После краткого введения, цель которого предоставить ознакомительные сведения о языке, в документе подробно рассматривается язык в нескольких последовательных шагах:

  1. Лексическая структура определяет набор текстов, которые являются лексически допустимыми.

  2. Значения, выражения, среды и переменные, идентификаторы и модель оценки, которые образуют основные понятия языка.

  3. Подробное описание значений, как примитивов, так и структурированных данных, определяет целевое назначение языка.

  4. Значения имеют типы, которые сами по себе являются особым видом значений. Оба они характеризуют фундаментальные типы значений и содержат дополнительные метаданные, относящиеся к формам структурированных значений.

  5. Набор операторов в языке M определяет, какие типы выражений могут быть сформированы.

  6. Функции, другая разновидность специальных значений, предоставляют основу для обширной стандартной библиотеки для языка M и позволяют добавлять новые абстракции.

  7. Ошибки могут возникать при применении операторов или функций во время вычисления выражения. Несмотря на то что ошибки не являются значениями, существуют способы обработки ошибок, с помощью которых ошибки можно сопоставить обратно со значениями.

  8. Выражения let позволяют создавать дополнительные определения, используемые для построения сложных выражений в несколько небольших шагов.

  9. Выражения if поддерживают условную оценку.

  10. Разделы обеспечивают простой механизм модульности. (Разделы пока еще не используются Power Query.)

  11. Наконец, консолидированная грамматика объединяет в себе фрагменты грамматики из других разделов этого документа в одно полное определение.

Для теоретиков компьютерных языков: язык формул, описываемый в этом документе, является по большей части чистым, динамически типизированным, частично функционально упрощенным языком высшего порядка.

Выражения и значения

Основной компонент в языке M — это выражение. Выражение можно вычислить, возвратив одно значение.

Хотя многие значения могут быть записаны буквально в виде выражения, значение не является выражением. Например, вычисление выражения 1 дает значение 1, а вычисление выражений 1+1 дает значение 2. Это неочевидное, но важное различие. Выражения являются наборами правил для вычисления, а значения — результатами вычисления.

В следующих примерах показаны различные виды значений, доступные в M. По соглашению значение записывается в литеральной форме, в которой они будут отображаться в выражении, результатом которого является только это значение. (Обратите внимание, что // указывает начало комментария, который продолжается до конца строки.)

  • Примитив — это однокомпонентное значение, например число, логическое значение, текст или значение NULL. Значение NULL может использоваться для указания отсутствия каких-либо данных.

    123                  // A number
    true                 // A logical
    "abc"                // A text
    null                 // null value
    
  • Значение списка является упорядоченной последовательностью значений. M поддерживает бесконечные списки, но в случае написания в виде литерала списки имеют фиксированную длину. Символы фигурных скобок (

    { и }) обозначают начало и конец списка.

    {123, true, "A"}     // list containing a number, a logical, and 
                          //     a text 
    {1, 2, 3}            // list of three numbers 
    
  • Запись представляет собой набор полей. Поле — это пара “имя-значение”, где имя является текстовым значением, уникальным в пределах записи поля. Литеральный синтаксис значений записи позволяет записывать имена без кавычек, в такой форме они также называются идентификаторами. Ниже показана запись, содержащая три поля с именами “A“, “B” и “C“, которые имеют значения 1, 2и 3.

    [ 
          A = 1,  
          B = 2,  
          C = 3 
    ]
    
  • Таблица

     — это набор значений, упорядоченных по столбцам (идентифицируемые по имени) и строкам. Для создания таблицы не предусмотрен литеральный синтаксис, однако существует несколько стандартных функций, которые можно использовать для создания таблиц из списков или записей.

    Пример:

    #table( {"A", "B"}, { {1, 2}, {3, 4} } ) 
    

    Данный код создает таблицу следующей формы:

  • Функция — это значение, которое при вызове с аргументами создает новое значение. Функции записываются путем перечисления параметров функции в круглых скобках, за которыми следует символ перехода =>, за которым следует определяющее функцию выражение. Это выражение обычно ссылается на параметры (по имени).

    (x, y) => (x + y) / 2`
    

Оценка

Модель оценки языка M базируется на модели оценки, часто применяемой в электронных таблицах, где порядок вычислений можно определить на основе зависимостей между формулами в ячейках.

Если вы ввели формулы в электронных таблицах, например в Excel, можно определить, что при вычислении указанные слева формулы дадут значения, указанные справа:

В языке M части выражения могут ссылаться на другие части выражения по имени, и процесс оценки автоматически определит порядок вычисления выражений, на которые имеются ссылки.

Можно использовать запись для создания выражения, эквивалентного приведенному выше примеру электронной таблицы. При инициализации значения поля мы можем сослаться на другие поля в записи по имени поля, как показано ниже:

[  
    A1 = A2 * 2,  
    A2 = A3 + 1,  
    A3 = 1  
]

Приведенное выше выражение эквивалентно следующему (в той части, что оба вычисляют равные значения):

[  
    A1 = 4,  
    A2 = 2,  
    A3 = 1  
]

Записи могут содержаться в других записях или вкладываться в них. Для обращения к полям записи по имени можно использовать

оператор подстановки ([]). Например, следующая запись содержит поле Sales, содержащее запись, и поле Total, которое обращается к полям FirstHalf и SecondHalf записи Sales:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = Sales[FirstHalf] + Sales[SecondHalf] 
]

Приведенное выше выражение эквивалентно следующему при вычислении:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = 2100 
]

Записи также могут содержаться в списках. Чтобы обратиться к элементу списка по его числовому индексу, используйте позиционный оператор индекса ({}). Для ссылки на значения в списке используется начинающийся с нуля индекс, отсчитываемый от начала списка. Например, индексы

0 и 1 используются для ссылки на первый и второй элементы в списке ниже:

[ 
    Sales =  
        {  
            [  
                Year = 2007,  
                FirstHalf = 1000,  
                SecondHalf = 1100, 
                Total = FirstHalf + SecondHalf // 2100 
            ], 
            [  
                Year = 2008,  
                FirstHalf = 1200,  
                SecondHalf = 1300, 
                Total = FirstHalf + SecondHalf // 2500 
            ]  
        }, 
    TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600 
]

Выражения элементов списка и записи (а также выражения let, представленные ниже) оцениваются с помощью отложенных вычислений, что означает, что они оцениваются только по мере необходимости. Все остальные выражения оцениваются с помощью безотложного вычисления, то есть сразу же при их обнаружении в процессе оценки. При этом следует помнить, что оценка выражения записи или списка возвратит значение записи или списка, которое помнит соответствующе поля записи или элементы списка, которые требуется вычислить при необходимости (с помощью операторов индекса или подстановки).

Функции

В языке M функция — это сопоставление набора входных значений с одним выходным значением. Функция записывается путем именования требуемого набора входных значений (параметров функции) и последующего предоставления выражения, которое будет вычислять результат функции с использованием этих входных значений (основная часть функции) после символа перехода (=>). Пример:

(x) => x + 1                    // function that adds one to a value 
(x, y) =>  x + y                // function that adds two values

Функция — это значение, аналогичное числу или текстовому значению.

В следующем примере показана функция, являющаяся значением поля “Add”, которая затем вызывается или выполняется из нескольких других полей. При вызове функции указывается набор значений, которые логически подставляются для требуемого набора входных значений в выражении тела функции.

[ 
    Add = (x, y) => x + y,
    OnePlusOne = Add(1, 1),     // 2 
    OnePlusTwo = Add(1, 2)      // 3
]

Библиотека

Язык M включает общий набор определений, доступных для использования в выражении, который именуется стандартной библиотекой или просто библиотекой для краткости. Эти определения состоят из набора именованных значений. Имена значений, предоставленных в библиотеке, можно использовать в выражении без необходимости определять их явным образом в выражении. Пример:

Number.E                        // Euler's number e (2.7182...) 
Text.PositionOf("Hello", "ll")  // 2

Операторы

Язык M включает набор операторов, которые можно использовать в выражениях. Операторы применяются к операндам для формирования символьных выражений. Например, в выражении 1 + 2 числа 1 и 2 являются операндами, а оператор представлен оператором сложения (+).

Значение оператора может меняться в зависимости от типа значений операндов. Например, оператор сложения можно использовать с другими видами значений, отличными от чисел:

1 + 2                   // numeric addition: 3 
#time(12,23,0) + #duration(0,0,2,0) 
                        // time arithmetic: #time(12,25,0)

Еще один пример оператора с операндом в зависимости от значения — оператор комбинирования (&):

"A" & "BC"              // text concatenation: "ABC" 
{1} & {2, 3}            // list concatenation: {1, 2, 3} 
[ a = 1 ] & [ b = 2 ]   // record merge: [ a = 1, b = 2 ]

Обратите внимание, что оператор может поддерживать не все сочетания значений. Пример:

1 + "2"  // error: adding number and text is not supported

Выражения, при вычислении которых возникают неопределенные условия оператора, обрабатываются как ошибки. Дополнительные сведения об ошибках в языке М представлены ниже.

Метаданные

Метаданные — это сведения о значении, которое связано со значением. Метаданные представлены в виде значения записи, которое называется записью метаданных. Поля записи метаданных можно использовать для хранения метаданных значения.

Каждое значение имеет запись метаданных. Если значение записи метаданных не указано, то запись метаданных пуста (не содержит поля).

Записи метаданных предоставляют способ связать дополнительную информацию с любым видом значения ненавязчивым способом. Связывание записи метаданных со значением не приводит к изменению значения или его поведения.

Значение записи метаданных y связывается с существующим значением x с помощью синтаксиса x meta y. Например, следующая связывает запись метаданных с полями Rating и Tags с текстовым значением "Mozart":

"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]

Для значений, которые уже содержат непустую запись метаданных, результат применения мета заключается в вычислении слияния записей существующей и новой записей метаданных. Например, следующие два выражения эквивалентны друг другу и предыдущему выражению:

("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ] 
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])

Обратиться к записи метаданных для указанного значения можно с помощью функции Value.Metadata. В следующем примере выражение в поле ComposerRating обращается к записи метаданных значения в поле Composer, а затем обращается к полю Rating записи метаданных.

[ 
    Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ], 
    ComposerRating = Value.Metadata(Composer)[Rating] // 5
]

Выражение let

Многие из приведенных выше примеров содержат в результате выражения все литеральные значения выражения. Выражение let позволяет вычислить, снабдить именами набор значений, а затем использовать их в последующем выражении, которое следует за оператором in. Например, в нашем примере данных о продажах можно сделать следующее:

let 
    Sales2007 =  
        [  
            Year = 2007,  
            FirstHalf = 1000,  
            SecondHalf = 1100, 
            Total = FirstHalf + SecondHalf // 2100 
        ], 
    Sales2008 =  
        [  
            Year = 2008,  
            FirstHalf = 1200,  
            SecondHalf = 1300, 
            Total = FirstHalf + SecondHalf // 2500 
        ] 
  in Sales2007[Total] + Sales2008[Total] // 4600

Результатом приведенного выше выражения является числовое значение (4600), вычисленное на основе значений, привязанных к именам Sales2007 и Sales2008.

Выражение if

Выражение if осуществляет выбор между двумя выражениями на основе логического условия. Пример:

if 2 > 1 then
    2 + 2
else  
    1 + 1

Первое выражение (2 + 2) выбирается, если логическое выражение (2 > 1) истинно, а второе выражение (1 + 1) выбирается, если оно ложно. Выбранное выражение (в данном случае 2 + 2) вычисляется и становится результатом выражения if (4).

ошибки

Ошибка в языке M означает, что при вычислении выражения не удалось получить значение.

Ошибки выдаются операторами и функциями, сталкивающимися с условиями ошибки, либо с помощью выражения error. Ошибки обрабатываются с помощью выражения try. При возникновении ошибки указывается значение, которое можно использовать для указания причины возникновения ошибки.

let Sales = 
    [ 
        Revenue = 2000, 
        Units = 1000, 
        UnitPrice = if Units = 0 then error "No Units"
                    else Revenue / Units 
    ], 
    UnitPrice = try Number. ToText(Sales[UnitPrice])
in "Unit Price: " & 
    (if UnitPrice[HasError] then UnitPrice[Error][Message]
    else UnitPrice[Value])

Приведенный выше пример обращается к полю Sales[UnitPrice] и форматирует значение, формирующее результат:

"Unit Price: 2"

Если бы поле Units было равно нулю, то поле UnitPrice привело бы к возникновению ошибки, которая была бы обработана выражением try. В этом случае итоговое значение имело бы следующий вид:

"No Units"

Выражение try преобразует надлежащие значения и ошибки в значение записи, которое указывает, обрабатывало ли выражение try ошибку или нет, и правильное значение либо запись об ошибке, извлеченные при обработке ошибки. Например, рассмотрим следующее выражение, которое вызывает ошибку и затем сразу же обрабатывает ее:

try error "negative unit count"

Результатом вычисления этого выражения является следующее вложенное значение записи, поясняющее подстановки полей [HasError], [Error] и [Message] в приведенном ранее примере с ценой на единицу.

[ 
    HasError = true, 
    Error = 
        [ 
            Reason = "Expression.Error", 
            Message = "negative unit count", 
            Detail = null 
        ] 
]

Распространена замена ошибок значениями по умолчанию. Чтобы добиться того же, но в компактной форме, можно использовать выражение try с необязательным предложением otherwise:

try error "negative unit count" otherwise 42 
// 42

Язык M для Power Query и Power BI: введение

– Мммм, Power Query!

Вот такие слова часто раздаются на курсах и семинарах по Excel и Power BI. Что такое Power Query? Это инструмент, который данные любого вида и из любых источников приводит в формат базы данных. Если вы не знаете, что такое Power Query, срочно посмотрите видео на нашем сайте и затем возвращайтесь к этой статье )

Power Query – это запросы, которые может создавать аналитик одной мышкой, указывая системе, куда обратиться и какие действия выполнить. Очень похоже на макросы. Только команды записываются на языке М и больше похожи на формулы Excel: там также есть знак равно, название функции и в скобочках аргументы. Power Query не требует знаний и навыков программиста: код на языке M генерируется автоматически.

Простыми щелчками мыши вы можете творить чудеса и решать почти все задачи, стоящие перед вами. Но иногда бывают такие случаи, когда запрос нужно все-таки поправить. А еще реже – написать полностью вручную. И чтобы развязать вам руки в работе с запросами Power Query, предлагаем вам краткое введение в М на русском языке.

Полное описание языка M доступно на сайте Microsoft, но пока только на английском языке.

Вы можете писать формулы на языке M в строке формул Power Query, расширенном редакторе или при добавлении настраиваемых (пользовательских) столбцов.

 

Строка формул

Для отображения строки формул перейдите в меню редактора Просмотр и выберите Строка формул.

Чтобы создать новый шаг запроса с помощью строки формул, нажмите кнопку fx.

 

Расширенный редактор

Расширенный редактор запросов в Power Query позволяет полностью написать запрос на языке M, без использования стандартного функционала. Перейдите в меню Просмотр -> Расширенный редактор.

На рисунке — пример кода запроса, который автоматически сгенерирован Power Query на языке M, по выполненным шагам обращения к данным.

Чтобы создать новый пустой запрос, в меню Excel перейдите на вкладку Данные -> Получить данные -> Из других источников -> Пустой запрос.

 

Добавление настраиваемого столбца

Для создания настраиваемого (пользовательского) столбца перейдите в меню Добавить столбец -> Настраиваемый столбец. В открывшемся окне введите формулу столбца на языке M.

Если вы откроете уже вами созданный запрос в расширенном редакторе, то увидите код, заключенный в конструкции let … in … На самом деле каждый запрос Power Query является одним выражением M, а оператор Let разделяет это выражение на несколько меньших.

 

Давайте разберемся, как устроен язык М. В языке М есть значения и выражения.

Значения — это значения, такие как число 1 или текстовая строка, или более сложные объекты, такие как таблицы. Также значения могут быть записаны как выражения, но при этом выражениями они не являются, например, 1+1 возвращает значение 2.

Выражение — это формула, используемая для построения значений. Выражение может быть сформировано с использованием синтаксических конструкций. Пример:

if 2 > 1 then 2 else 1

 

Ниже приведены типы значений, доступных в М:

  1. Простые значения (primitive value) – числовые, логические, текст или null. Например:
    123 — число,
    true — логическое значение,
    null – отсутствие данных, null
  1. Список (list) – упорядоченная последовательность значений. Фигурные скобки { и } обозначают начало и конец списка. Пример:
    {1, 2, 3} – список из чисел.
  1. Запись (record) – это упорядоченная последовательность полей, где каждое поле имеет имя и одно значение (любого типа). Пример:
    [ A = 1, B = 2, C = 3 ]
  1. Таблица (table) – набор значений в виде строк и именованных столбцов. Нет определенного синтаксиса для создания таблицы, ее можно создать или обратиться к ней с помощью нескольких стандартных функций.
    Например:
#table( {"A", "B"}, { {1, 2}, {3, 4} } )

Будет создана таблица:

  1. Функция (function) преобразует набор входящих значений в одно результирующее. Функция записывается путем перечисления параметров функции в круглых скобках ( ), за которыми следует знак перехода => далее указывают выражение, определяющее функцию.
    (x, y) => (x + y) / 2

     

 

Внимание! Язык М чувствителен к регистру. Так, например, формула Excel. CurrentWorkbook() сработает, а Excel.currentworkbook() – нет, потому что написана без учета регистра.

 

Как записать комментарии в тексте запроса

Комментарии в одну строку начинаются с двойной черты //
Комментарии на нескольких строках начинаются и заканчиваются символами /* и */

Нажмите кнопку fx в строке формул и введите название формулы без скобок (). Появится окно со справкой по этой формуле. Ниже приведен пример справки по формуле Excel.Workbook

 

Весь перечень формул можно вывести, написав в строке формул = #shared
Появится список формул. Если щелкнуть по формуле, в нижней части экрана появится справочная информация. Из списка можно выбрать нужную формулу и тут же добавить ее в запрос.

Вы можете указывать имена для обозначения значений – идентификаторы. Если в идентификаторе есть пробел, то он указывается с помощью символа # и в кавычках, например:

[ #"2016 Sales" = 1000,
 #"2017 Sales" = 1100,
 #"Total Sales" = #"2016 Sales" + #"2017 Sales" ]

 

Для обращения к данным записей (record) используются идентификаторы с квадратными скобками [ ].  Пример:

[ Data = [ Base Line = 100, Rate = 1.8 ],
Progression = Data[Base Line] * Data[Rate]  ]

 

В языке M есть зарезервированные последовательности символов, которые нельзя использовать как операторы, это:

and as each else error false if in is let meta not otherwise or section shared then true try type #binary #date #datetime #datetimezone #duration #infinity #nan #sections #shared #table #time

 

Также есть стандартные операторы и знаки пунктуации:

, ; = < <= > >= <> + - * / & ( ) [ ] { } @ ! ? => .. ...

 

Логические выражения if

Логические выражения записываются как if…then…else

Например:

if [Sales] > 1000 then "более 1000" else if [Sales] > 500 then "более 500" else "500 или меньше"

 

Оператор let

Выражение let позволяет вычислять набор значений, назначить имена, а затем используется в следующем выражении, которое записывается в in.

Например:

let
    Sales2017 =
     [ Year = 2017, FirstHalf = 1000, SecondHalf = 1100,
       Total = FirstHalf + SecondHalf   ], // 2100
    Sales2018 =
     [ Year = 2018, FirstHalf = 1200, SecondHalf = 1300,
       Total = FirstHalf + SecondHalf  ] // 2500
in 
    Sales2017[Total] + Sales2018[Total] // 4600
 

 

Для сложных запросов могут использоваться вложения let, что позволяет сделать запрос более читаемым.

Например:

let 
      AreaСalculation = (x, y) => 
            let 
                  Area = x * y, 
                  DoubleArea = Area * 2 
            in 
            DoubleArea 
in 
AreaСalculation

Это введение в правила языка M. Получается легкая смесь формул Excel и программирования. На самом деле с Excel больше общего, чем кажется вначале. Например, обращение к столбцу Base Line в записи Data, записанное как:
= Data[Base Line]
напоминает синтаксис Excel, когда вы ссылаетесь на ячейку A1 на другом листе. Формула будет похожей:
=Лист!A1
Отличие только в том, что после названия листа стоит восклицательный знак. И в том, что в Power Query, или в M мы обычно ссылаемся не на отдельную ячейку, а на столбец целиком. В остальном запись идентична: таблица аналогична листу, столбец – ячейке.

Если рассматривать M в таком ключе, то многие команды становятся интуитивно понятными, что мы с вами дальше и увидим.

Смотрите продолжение в следующей статье:

Язык M для Power Query и Power BI: работа с данными

Продолжаем разбираться с языком M. Рассмотрим подробнее, как с помощью языка M в Power Query работать со списками, записями, таблицами. А также как создавать собственные функции.

Теги: ExcelPower BI

Автор: Станислав Салостей

Введение в язык формул Power Query M — PowerQuery M

  • Статья
  • 12 минут на чтение

Обзор

Microsoft Power Query предоставляет мощное средство получения данных, которое включает в себя множество функций. Основная возможность Power Query — фильтровать и объединять, то есть «смешивать» данные из одного или нескольких обширных коллекций поддерживаемых источников данных. Любое такое коллажирование данных выражается с использованием языка формул Power Query (неофициально известного как «M»). Power Query встраивает M-документы в широкий спектр продуктов Microsoft, включая Excel, Power BI, Analysis Services, Dataverse, чтобы обеспечить воспроизводимое объединение данных.

В этом документе содержится спецификация языка М. После краткого введения, направленного на формирование первых интуитивных представлений и знакомства с языком, документ подробно описывает язык в несколько последовательных шагов:

  1. Лексическая структура определяет набор лексически допустимых текстов.

  2. Значения, выражения, среды и переменные, идентификаторы и модель оценки образуют основных понятия языка .

  3. Подробная спецификация значений , как примитивных, так и структурированных, определяет целевую область языка.

  4. Значения имеют типов , которые сами по себе представляют особый вид значений, которые характеризуют основные виды значений и содержат дополнительные метаданные, характерные для форм структурированных значений.

  5. Набор из операторов в M определяет, какие типы выражений могут быть сформированы.

  6. Функции , еще один тип специальных значений, обеспечивают основу для богатой стандартной библиотеки для M и позволяют добавлять новые абстракции.

  7. Ошибки могут возникать при применении операторов или функций во время вычисления выражения. Хотя ошибки не являются значениями, существуют способы обработки ошибок , которые отображают ошибки обратно в значения.

  8. Пусть выражения позволяют вводить вспомогательные определения, используемые для построения сложных выражений меньшими шагами.

  9. Если выражения поддерживают условное вычисление.

  10. Секции обеспечивают простой модульный механизм. (Разделы еще не используются Power Query.)

  11. Наконец, объединенная грамматика собирает фрагменты грамматики из всех других разделов этого документа в одно полное определение.

Для теоретиков компьютерных языков: язык формул, указанный в этом документе, является в основном чистым, динамически типизированным, частично ленивым функциональным языком высшего порядка.

Выражения и значения

Центральной конструкцией M является выражение . Выражение может быть оценено (вычислено), что даст одно значение .

Хотя многие значения можно записать буквально как выражение, значение не является выражением. Например, выражение 1 оценивается как значение 1 ; выражение 1+1 оценивается как значение 2 . Это различие тонкое, но важное. Выражения — это рецепты вычислений; значения являются результатом оценки.

Следующие примеры иллюстрируют различные виды значений, доступных в M. По соглашению, значение записывается с использованием буквальной формы, в которой оно должно появляться в выражении, результатом которого является именно это значение. (Обратите внимание, что // указывает на начало комментария, который продолжается до конца строки.)

  • Примитивное значение представляет собой значение, состоящее из одной части, например числовое, логическое, текстовое или нулевое. . Нулевое значение может использоваться для обозначения отсутствия каких-либо данных.

     123 // Номер
    true // Логический
    "абв" // текст
    ноль // нулевое значение
     
  • Значение списка представляет собой упорядоченную последовательность значений. M поддерживает бесконечные списки, но если они написаны как литералы, списки имеют фиксированную длину. Фигурные скобки { и } обозначают начало и конец списка.

     {123, true, "A"} // список, содержащий число, логическое и
                          //     текст
    {1, 2, 3} // список из трех чисел
     
  • Запись представляет собой набор из полей . Поле — это пара имя/значение, где имя — это текстовое значение, уникальное в записи поля. Буквенный синтаксис для значений записи позволяет записывать имена без кавычек, форма также называется идентификаторами . Ниже показана запись, содержащая три поля с именами « A », « B » и « C », которые имеют значения 1 , 2 и 9.0101 3 .

     [
          А = 1,
          В = 2,
          С = 3
    ]
     
  • Таблица представляет собой набор значений, организованных в столбцы (которые идентифицируются по имени) и строки. Для создания таблицы не существует буквального синтаксиса, но есть несколько стандартных функций, которые можно использовать для создания таблиц из списков или записей.

    Например:

     #таблица({"A", "B"}, {{1, 2}, {3, 4} } )
     

    Это создает таблицу следующей формы:

  • Функция — это значение, которое при вызове с аргументами создает новое значение. Функция записывается путем перечисления параметров функции в круглых скобках, за которыми следует символ перехода => , за которым следует выражение, определяющее функцию. Это выражение обычно относится к параметрам (по имени).

     (х, у) => (х + у) / 2`
     

Оценка

Модель оценки языка M смоделирована по образцу модели оценки, обычно используемой в электронных таблицах, где порядок вычислений можно определить на основе зависимостей между формулами в ячейках.

Если вы написали формулы в электронной таблице, такой как Excel, вы можете распознать, что формулы слева при вычислении приведут к значениям справа:

В M части выражения могут ссылаться на другие части выражения. выражения по имени, и процесс оценки автоматически определит порядок, в котором вычисляются выражения, на которые ссылаются.

Мы можем использовать запись для создания выражения, эквивалентного приведенному выше примеру электронной таблицы. При инициализации значения поля мы можем ссылаться на другие поля в записи, используя имя поля, как показано ниже:0017

 [
    А1 = А2 * 2,
    А2 = А3 + 1,
    А3 = 1
]
 

Вышеприведенное выражение эквивалентно следующему (в том смысле, что оба оцениваются как равные значения):

 [
    А1 = 4,
    А2 = 2,
    А3 = 1
]
 

Записи могут содержаться внутри или вкладывать в другие записи. Мы можем использовать оператор поиска ( [] ) для доступа к полям записи по имени. Например, в следующей записи есть поле с именем Продажи , содержащее запись, и поле с именем Итого , которое обращается к полям FirstHalf и SecondHalf записи Sales :

 [
    Продажи = [Первая половина = 1000, Вторая половина = 1100],
    Итого = Продажи [Первая половина] + Продажи [Вторая половина]
]
 

Приведенное выше выражение эквивалентно следующему при вычислении: \

 [
    Продажи = [Первая половина = 1000, Вторая половина = 1100],
    Всего = 2100
]
 

Записи также могут содержаться в списках. Мы можем использовать оператор позиционного индекса ( {} ) для доступа к элементу в списке по его числовому индексу. Значения в списке упоминаются с использованием индекса с отсчетом от нуля с начала списка. Например, индексы 0 и 1 используются для ссылки на первый и второй элементы в списке ниже:

 [
    Продажи =
        {
            [
                Год = 2007,
                Первая половина = 1000,
                вторая половина = 1100,
                Всего = первая половина + вторая половина // 2100
            ],
            [
                Год = 2008,
                Первая половина = 1200,
                Вторая половина = 1300,
                Итого = первая половина + вторая половина // 2500
            ]
        },
    TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600
]
 

Выражения элементов списка и записи (а также выражения let, представленные ниже) оцениваются с использованием ленивых вычислений , что означает, что они оцениваются только по мере необходимости. Все остальные выражения оцениваются с использованием нетерпеливой оценки , что означает, что они оцениваются немедленно, если встречаются в процессе оценки. Хороший способ подумать об этом — помнить, что вычисление выражения списка или записи вернет список или значение записи, которое само запоминает, как его элементы списка или поля записи должны быть вычислены при запросе (операторами поиска или индекса).

Функции

В M функция представляет собой отображение набора входных значений в одно выходное значение. Функция записывается, сначала называя требуемый набор входных значений (параметры функции), а затем предоставляя выражение, которое будет вычислять результат функции, используя эти входные значения (тело функции) после перехода к ( => ) символ. Например:

 (x) => x + 1 // функция, которая добавляет единицу к значению
(x, y) => x + y // функция, которая складывает два значения
 

Функция — это значение, такое же, как число или текстовое значение. В следующем примере показана функция, являющаяся значением поля Add, которое затем вызывается или выполняется из нескольких других полей. При вызове функции задается набор значений, которые логически заменяют требуемый набор входных значений в выражении тела функции.

 [
    Добавить = (х, у) => х + у,
    OnePlusOne = Добавить(1, 1), // 2
    OnePlusTwo = добавить (1, 2) // 3
]
 

Библиотека

M включает общий набор определений, доступных для использования из выражения, называемого стандартной библиотекой или просто библиотекой для краткости. Эти определения состоят из набора именованных значений. Имена значений, предоставленные библиотекой, доступны для использования в выражении без явного определения выражением. Например:

 Number.E // число Эйлера e (2,7182...)
Text.PositionOf("Привет", "ll") // 2
 

Операторы

M включает набор операторов, которые можно использовать в выражениях. Операторы применяются к операндам для формирования символьных выражений. Например, в выражении 1 + 2 числа 1 и 2 являются операндами, а оператором является оператор сложения ( + ).

Значение оператора может различаться в зависимости от типа значений его операндов. Например, оператор «плюс» можно использовать с другими типами значений, кроме чисел:

 1 + 2 // цифровое сложение: 3
#время(12,23,0) + #продолжительность(0,0,2,0)
                        // арифметика времени: #time(12,25,0)
 

Другим примером оператора со значением, зависящим от операнда, является комбинированный оператор ( и ):

 "A" и "BC" // конкатенация текста: "ABC"
{1} и {2, 3} // объединение списков: {1, 2, 3}
[ a = 1 ] & [ b = 2 ] // слияние записей: [ a = 1, b = 2 ]
 

Обратите внимание, что не все комбинации значений могут поддерживаться оператором. Например:

 1 + "2" // ошибка: добавление номера и текста не поддерживается
 

Выражения, которые при оценке встречают неопределенные операторные условия, оцениваются как ошибки. Подробнее об ошибках в M позже.

Метаданные

Метаданные — это информация о значении, связанном со значением. Метаданные представлены в виде значения записи, называемого записью метаданных . Поля записи метаданных можно использовать для хранения метаданных значения.

Каждое значение имеет запись метаданных. Если значение записи метаданных не указано, то запись метаданных пуста (не имеет полей).

Записи метаданных позволяют связать дополнительную информацию с любым значением ненавязчивым образом. Связывание записи метаданных со значением не меняет значение или его поведение.

Значение записи метаданных y связано с существующим значением x с использованием синтаксиса x meta y . Например, следующее связывает запись метаданных с полями Рейтинг и Теги с текстовым значением «Моцарт» :

 "Моцарт" мета [ Рейтинг = 5, Метки = {"Классика"} ]
 

Для значений, которые уже содержат непустую запись метаданных, результатом применения meta является вычисление слияния существующей и новой записи метаданных. Например, следующие два выражения эквивалентны друг другу и предыдущему выражению:

 ("Моцарт" мета [ Рейтинг = 5 ]) мета [ Теги = {"Классика"} ]
Мета "Моцарт" ([ Rating = 5 ] & [ Tags = {"Classical"} ])
 

Доступ к записи метаданных для заданного значения можно получить с помощью функции Value.Metadata . В следующем примере выражение в поле ComposerRating обращается к записи метаданных значения в поле Composer , а затем обращается к полю Rating записи метаданных.

 [
    Композитор = "Моцарт" мета [ Рейтинг = 5, Метки = {"Классика"} ],
    ComposerRating = Значение.Метаданные(Композитор)[Рейтинг] // 5
]
 

Пусть выражение

Многие из показанных до сих пор примеров включали все литеральные значения выражения в результат выражения. Выражение let позволяет вычислить набор значений, присвоить имена и затем использовать их в последующем выражении, которое следует за в . Например, в нашем примере с данными о продажах мы могли бы сделать:

 пусть
    Продажи2007 =
        [
            Год = 2007,
            Первая половина = 1000,
            вторая половина = 1100,
            Всего = первая половина + вторая половина // 2100
        ],
    Продажи2008 =
        [
            Год = 2008,
            Первая половина = 1200,
            Вторая половина = 1300,
            Итого = первая половина + вторая половина // 2500
        ]
  в Sales2007[Total] + Sales2008[Total] // 4600
 

Результатом приведенного выше выражения является числовое значение ( 4600 ), которое было вычислено из значений, привязанных к именам Sales2007 и Sales2008 .

Выражение If

Выражение if выбирает одно из двух выражений на основе логического условия. Например:

 если 2 > 1 то
    2 + 2
еще
    1 + 1
 

Первое выражение ( 2 + 2 ) выбирается, если логическое выражение ( 2 > 1 ) истинно, а второе выражение ( 1 + 1 ) выбирается, если оно ложно. Выбранное выражение (в данном случае 2 + 2 ) оценивается и становится результатом выражения if ( 4 ).

Ошибки

Ошибка указывает на то, что в процессе вычисления выражения не удалось получить значение.

Ошибки вызываются операторами и функциями, сталкивающимися с условиями ошибки, или при использовании выражения ошибки. Ошибки обрабатываются с помощью выражения try. При возникновении ошибки указывается значение, которое можно использовать для указания причины возникновения ошибки.

 пусть Продажи =
    [
        Доход = 2000,
        Единицы = 1000,
        UnitPrice = если Units = 0, то ошибка "No Units"
                    еще Доход / Единицы
    ],
    UnitPrice = попробуйте Number. ToText(Sales[UnitPrice])
в "Цена за единицу:" &
    (если UnitPrice[HasError], то UnitPrice[Error][Message]
    иначе UnitPrice[Значение])
 

В приведенном выше примере выполняется доступ к полю Sales[UnitPrice] и форматирование значения с получением результата:

 "Цена за единицу: 2"
 

Если бы поле Units было равно нулю, то поле UnitPrice вызвало бы ошибку, которая была бы обработана попыткой . В результате получилось бы:

 "Нет единиц"
 

Выражение try преобразует правильные значения и ошибки в значение записи, которое указывает, было ли обработано выражение try и ошибка или нет, и либо правильное значение, либо запись об ошибке, извлекаемую при обработке ошибки. Например, рассмотрим следующее выражение, которое вызывает ошибку, а затем сразу ее обрабатывает:

 ошибка попытки "отрицательное количество единиц"
 

Это выражение возвращает следующее значение вложенной записи, объясняющее поиск полей [HasError] , [Error] и [Message] в приведенном выше примере с ценой за единицу.

 [
    ХасОррор = Истина,
    Ошибка =
        [
            Причина = "Выражение.Ошибка",
            Сообщение = "отрицательное количество единиц",
            Деталь = ноль
        ]
]
 

Распространенным случаем является замена ошибок значениями по умолчанию. 9Выражение 0101 try можно использовать с необязательным предложением , иначе , чтобы добиться именно этого в компактной форме:

 ошибка попытки "отрицательное число единиц", иначе 42
// 42
 

Краткий обзор — PowerQuery M

Твиттер LinkedIn Фейсбук Электронная почта

  • Статья
  • 2 минуты на чтение

В этом кратком обзоре описывается создание запросов на языке формул Power Query M.

Примечание

M — язык с учетом регистра.

Создайте запрос с помощью редактора запросов

Чтобы создать расширенный запрос, используйте редактор запросов . Смешанный запрос состоит из переменных, выражений и значений, инкапсулированных выражением let . Переменная может содержать пробелы, используя идентификатор # с именем в кавычках, например #"Имя переменной" .

Выражение let имеет следующую структуру:

 let
   Имя переменной = выражение,
   #"Имя переменной" = выражение2
в
   Имя переменной
 

Чтобы создать M-запрос в редакторе запросов , выполните следующие действия:

  1. Создайте серию шагов формулы запроса, которые начинаются с оператора let . Каждый шаг определяется именем переменной шага. Переменная M может включать пробелы, используя символ # как #"Имя шага" . Шаг формулы может быть пользовательской формулой. Обратите внимание, что язык формул Power Query чувствителен к регистру.

  2. Каждый шаг формулы запроса основывается на предыдущем шаге, ссылаясь на шаг по имени его переменной.

  3. Вывод шага формулы запроса с использованием инструкции in . Как правило, последний шаг запроса используется как окончательный результат набора данных.

Чтобы узнать больше о выражениях и значениях, перейдите к разделу Выражения, значения и выражение let.

Шаги формулы Simple Power Query M

Предположим, вы создали следующее преобразование в редакторе запросов для преобразования имен продуктов в правильный регистр.

У вас есть таблица, которая выглядит так:

ID заказа идентификатор клиента Товар Цена
1 1 удочка 100
2 1 1 фунт червяков 5
3 2 рыболовная сеть 25

Кроме того, вы хотите написать каждое слово в столбце Item с заглавной буквы, чтобы получить следующую таблицу:

ID заказа идентификатор клиента Товар Цена
1 1 Удочка 100
2 1 1 фунт.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *