Для тех, кто в танке
3.38K subscribers
8 photos
2 videos
3 files
196 links
Канал создан для себя, обсуждаем вопросы использования языка M и шарим всякие полезные ссылки.
На вопросы отвечаем в комментах и тут - t.me/pbi_pq_from_tank_chat

Для желающих поддержать канал - https://sponsr.ru/pq_m_buchlotnik/
Download Telegram
#PQ, #pbi
Всем добра! Сегодня покажу как синхронно разворачивать списки из соседних ячеек.
Дано. Получили из API некий JSON который на выходе выдал структуру со вложенными списками как в таблице tbl (см. в коде ниже). Надо развернуть содержимое списков в новые строки, но если мы это сделаем стандартным мышиным способом с разворачиванием списков в строки по очереди то получится декартово произведение, не такое красивое как это но тоже ничего. Что же делать? А на самом деле все довольно просто: надо не разворачивать столбцы, а при помощи функции Table.FromColumns собрать из них готовую таблицу в новом столбце:
let
 tbl = Table.FromRecords (
   {
     [ Company = 1, Phone = { "1".."9" }, Mail = { "1".."6", "", "8".."9" } ],
     [ Company = 2, Phone = { "1".."5" }, Mail = { "2".."6" } ]
   }
 ),
 gentabs = Table.AddColumn(
   tbl,
   "tabs",
   each Table.FromColumns(
     {List.Repeat({[Company]}, List.Count([Phone])),[Phone],[Mail]},
     Table.ColumnNames(tbl)
   )
 ),
 tabs = Table.Combine(gentabs[tabs])
in
   tabs

Но может еще случиться, что столбцов с простым содержимым (не списки) будет много, и тогда использование List.Repeat станет узким местом с точки зрения производительности, да и код сильно потеряет свою наглядность. Но для этого случая можно применить мою любимую функцию Table.FillDown до объединения таблиц и получим точно такой же результат.
let
 tbl = Table.FromRecords (
   {
     [ Company = 1, Phone = { "1".."9" }, Mail = { "1".."6", "", "8".."9" } ],
     [ Company = 2, Phone = { "1".."5" }, Mail = { "2".."6" } ]
   }
 ),
 gentabs = Table.AddColumn(
   tbl,
   "tabs",
   each Table.FromColumns(
     {{[Company]},[Phone],[Mail]},
     Table.ColumnNames(tbl)
   )
 ),
   filled = Table.AddColumn(gentabs, "tabs_", each Table.FillDown([tabs],{"Company"})),
   tabs = Table.Combine(filled[tabs_])
in
   tabs