Списки в Power Query - як, коли і чому

Мова M має так звані структуровані значення, до яких належать списки, записи та таблиці. Кожен тип значень має певні цілі, і ця публікація призначена для вступу до списків. Цей допис є частиною серії про списки, записи та таблиці в М. Я включив кілька знімків екрану з кодом М у цей пост. Ви можете завантажити код зі скріншотів у вигляді файлу txt тут. Для завантаження не потрібен пароль. Якщо вас все ще запитують пароль OneDrive, змініть браузер на Edge.

У М існує два типи значень: примітивні та структуровані значення. Прикладами примітивних значень є:

  • „А“,
  • 1,
  • правда.

Вони примітивні таким чином, що не вибиваються з інших цінностей. На відміну від примітивних значень, ми маємо так звані структуровані значення в M, які складаються з інших значень, примітивних та структурованих. Список є одним із таких структурованих значень (інші - це записи та таблиці), і він описується як „упорядкована послідовність значень“. Визначений список вводиться з фігурною фігурною дужкою, що відкривається. Навіть якщо списки може бути порожній (це виглядає так „<>“), списки є не обмежена в розмірах, оскільки M підтримує нескінченно великі списки.

Прикладом дуже простого представника списку є:

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

У переважній більшості випадків список буде використовуватися як проміжний продукт для інших запитів. У будь-якому випадку, надзвичайно рідко коли список завантажується в модель даних.

Є багато рідних функції в М, які забезпечують корисну функціональність і очікувати списки як один або кілька їхніх параметри. У цих випадках важливо знати, як створювати списки, щоб ви могли належним чином надати цим функціям необхідні параметри.

До того ж їх дуже багато функції в М що списки повернення як повернені значення. З цих причин необхідно знати, як з ними боротися, щоб безпечно користуватися мовою М.

Давайте подивимось, як створювати списки.

Список у М зазвичай має початок і кінець, і, на мій досвід, вони є 3 шляхи в М щоб створити список:

1. Використання синтаксису ініціалізації списку за допомогою фігурних дужок

Ви можете визначити список, скориставшись фігурною дужкою, що відкривається, «списком предметів» і закінчити його фінальною фігурною дужкою «>». Найпростіший список - це порожній список.

Порожні списки

порожній список - найпростіший з усіх списків, в якому список елементів порожній:

Прикладом практичного використання порожнього списку є, наприклад, створення таблиці в моделі даних Power BI, яка містить лише міри. На відміну від порожньої таблиці, створеної в Power Query (яку ви можете створити так: = #table (<>, <>)), яка просто не відображається в моделі даних, порожній список імпортується у вигляді таблиці у модель даних з одним стовпцем і без рядків. Просто сховайте отриманий стовпець у моделі даних і використовуйте цю порожню таблицю як таблицю мір.

списки
Створення таблиці мір за допомогою порожнього списку в M

Порожній список, звичайно, більше особливий випадок, оскільки списки зазвичай містять значення, так звані елементи.

Списки з розділеними комами елементами

Для створення непорожній list, я можу додати до списку значення, відокремлені комами, будь-якого типу наступним чином:

Створення непустого списку вручну

Якщо я хочу додати велику кількість суміжних значень до списку, визначення, розділене комами, є досить складним. Але в цьому є допомога ...

Списки із суміжними номерами

Наприклад, якщо я хочу створити список, який відображає цілий числа від 1 до 100, Мені не потрібно вручну додавати всі ці номери до списку. Натомість є наступне скорочення:

Якщо, наприклад, я хотів би, щоб були вказані цілі числа від 1 до 100, але номер 48 має бути виключено, тоді це працює наступним чином:

Така послідовність суміжних значень не повинна мати більше 2 ^ 31 (2.147.483.647) значень. Наприклад, подивіться на наступне визначення списку:

Через те, що тут вказано діапазон чисел, більший за 2 147 483 647, повертається таке повідомлення про помилку:

Суміжні числа не повинні бути невизначено великими

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

Синтаксис „.“ для суміжного діапазону цілих чисел також можна застосувати до символів.

Списки із суміжними символами

Процедура, яку я щойно показав для послідовних цифр, також можлива для букв і символів. Наприклад, допустимо визначити наступний список:

Тоді результат виглядає наступним чином:

Можливо, не дивно, що Power Query „знає”, що після „a” постає „b”, але подивіться на список та його результат:

Між літерами „Z“ та „a“ також є ряд спеціальні символи. Отже, що лежить в основі цього списку, і це порядок сортування?

Списки символів базуються на Unicode

Символ функції M.ToNumber () відкриває секрет:

Списки символів базуються на Unicode

Списки символів, що використовують „.“ - синтаксис внутрішньо використання Юнікод визначення щоб визначити як символи, так і їх порядок. Отже, список внутрішньо перетворюється на і, нарешті, до списку символів Unicode. Якщо ви хочете побачити відповідний символ Unicode для спеціального числового значення, ви можете скористатися функцією Charater.FromNumber (). Наприклад, Character.FromNumber (91) призводить до "[" .

Ця впорядкована послідовність символів Unicode є причиною, чому створюється порожній список: Список внутрішньо перетворюється у свої числові значення, що в цьому випадку означає. Оскільки початок визначеного списку перед кінцем списку, результатом є порожній список.

Визначення списків вручну - один із способів. Давайте подивимось, як це зробити створювати списки за допомогою відповідний функції.

2. Використання власних функцій M, які створюють списки

На момент написання статті ми маємо 63 функції в М які повертають список. Найбільш очевидні з них - це функції List. * (Але не всі вони створюють списки). Популярні приклади:

Також легко визначити функції перетворення * .ToList () (про які я розповім більш докладно пізніше), такі як:

Усі ці функції створюють списки на основі вхідних параметрів. Але є й інший спосіб створити список.

3. Посилання на стовпець/поле в таблиці

Третім способом створення списку є посилання на стовпець таблиці, використовуючи такий синтаксис: Таблиця [Ім'я стовпця]:

Створення списку шляхом посилання на стовпець у таблиці

Оскільки це може бути не очевидно, я згадаю тут, що посилання на назву кроку (якщо повертає таблицю) має той самий ефект, що і посилання на вираз таблиці: # "назва кроку" [Стовпець] .

Тепер, коли ми знаємо, що таке списки та як вони створюються, ми зосередимося на роботі зі списками.

Існує 3 оператори які можна використовувати разом зі списками: „=“ та „<>“ дають змогу порівнювати списки, тоді як „&“ об’єднує списки. Ось кілька прикладів того, як це використовувати:

  1. =→ правда
  2. <>→ правда
  3. &→. Цього також можна досягти за допомогою функції List.Combine (<, >)

Інший аспект, який цікавий щодо списків, - це як отримати доступ до елементів у списку.

Отримавши список, іноді потрібно безпосередньо отримати доступ до спеціальних елементів у списку.

Використання оператора позиційного індексу <>

Щоб отримати доступ до елемента у списку, ви можете використовувати так званий - оператор позиційного індексу „<>“ За числовим індексом. елементів у списку відносяться до використання a нульовий індекс. Наступні приклади детально пояснюють це:

Візьміть такий список: MyList =. Оскільки внутрішній індекс елементів списку починається з нуля, я отримую такі результати:

MyList приводить до наступного повідомлення про помилку, в якому йдеться про те, що робиться спроба отримати доступ до елемента списку, який не існує у списку:

Щоб подолати це останнє повідомлення про помилку, ви можете використовувати так званий вибір-вибір-елемента наступним чином, який повертає нуль, якщо вибраний елемент не існує:

MyList ? нуль

Щоб дізнатись, скільки елементів у списку, можна скористатися функцією List.Count (). List.Count (MyList) веде до результату 3, тому останній елемент у списку має індекс 2 (List.Count (MyList) -1), оскільки індекс базується на нулі.

На додаток до наведених вище прикладів, існують також різні рідні функції M, які дозволяють доступ до елементів у списку.

Використання власних функцій М.

Бібліотека M пропонує широкий спектр функцій списку, деякі з яких забезпечують доступ до елементів списку. Для наступних прикладів візьміть цей список як вказано: MyList =

Список.Перший ()

Ця функція отримує доступ до першого елемента у списку, що еквівалентно використанню оператора позиційного індексу з індексом 0 (наприклад, MyList).

List.FirstN ()

Ця функція працює двома способами.

  1. Якщо другий параметр функції - a номер, перші елементи списку повертаються до цього номера: List.FirstN (MyList, 2) =
  2. Якщо другий параметр розваги - це хвороба, всі ці елементи повертаються, доки умова більше не застосовується вперше: List.FirstN (MyList, кожен _

List.Last ()

Ця функція отримує доступ до останнього елемента у списку. Наступні два вирази однакові: List.Last (MyList) = MyList

List.LastN ()

Працює як List.FirstN, але навпаки.

List.Range ()

Повертає кількість елементів, що починаються зі зміщенням. List.Range (MyList, 2, 3) призводить до такого результату:

Виберіть ()

Ця функція визначає елементи списку не на основі їх позиції в списку, а на основі певних умов, яким повинен відповідати цей елемент. Наступний приклад переглядає список і вибирає ті елементи, значення яких перевищує 2:

List.Select (MyList, кожен _> 2), який повертає наступний список як результати:

Іноді ви хочете використовувати певну функціональність у M і шукати відповідну функцію. Якщо, наприклад, я хочу перейменуйте назву стовпця таблиці з іменами стовпців, що динамічно відхиляються, я можу зробити це в М за допомогою функції Table.RenameColumns (). Якщо я проігнорую останній необов’язковий параметр функції, то її структуру можна описати наступним чином:

Table.RenameColumns (таблиці з іменами стовпців, які потрібно змінити, список зі структурою)

На наступному скріншоті показано сценарій M, який перейменовує два існуючі стовпці таблиці та підготовлений до зміни заголовків стовпців вихідної таблиці під час наступного запуску. Фактичне перейменування заголовків стовпців відбувається в останньому рядку виразу let (2). Всі кроки, описані в червоному полі (1), використовуються для створення динамічного списку старих пар імен/нових імен, необхідних для функції Table.RenameColumns ().

Перейменування динамічно змінних назв стовпців

Давайте далі розглянемо функції, які генерують списки.

Багато функцій у M генерують списки, і найбільш очевидними з них є функції * .ToList:

* .ToList функції

Binary.ToList () - Створює список із двійкових файлів.

Record.ToList () - Перетворює запис у список, що містить значення полів запису.

Приклад Record.ToList ()

Table.ToList () - Створює список із таблиці, відокремлюючи стовпці рядок за рядком за допомогою роздільника, який можна визначити в необов’язковому параметрі об’єднувача (наприклад, Combiner.CombineTextByDelimiter (","))

Приклад таблиці.ToList ()

Text.ToList () - створює список із тексту, додаючи кожен символ окремо як елемент списку.

Приклад Text.ToList ()

Однак функції * .ToList - це не єдині функції, які генерують список із значення певного типу.

Інші функції, які створюють списки

Для деяких функцій назва не означає, що вони створюють списки. Прикладом цього є функція Text.Split (). Уявіть собі наступне завдання: У довгому тексті підрахуйте кількість різних слів. Наступний сценарій робить це за допомогою Text.Split () у поєднанні з іншими функціями списку.

Використання Text.Split () для підрахунку (різних) слів

Інші приклади функцій, які повертають списки, але звучать не так:

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

Привіт з Німеччини,

Lars ist Berater, Entwickler und Trainer for Microsoft Power BI. Er ist zertifizierter Power BI-Experte та Microsoft Trainer. Für sein Engagement in der internationalen Community wurde Lars seit 2017 jährlich durch Microsoft der MVP-Award verliehen. Lies hier mehr…