Q: Как динамически расширять записи - PullRequest
0 голосов
/ 29 марта 2020

У меня есть сценарий использования, когда у меня есть несколько столбцов, содержащих записи, которые я хочу динамически расширять. Это означает, что имя столбцов для расширения не жестко закодировано.

Expanded = Table.ExpandRecordColumn(Source, "HardcodedColumnName", {"fieldname"}, {"fieldname"}),

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

let
   //Use-case: dynamically expand 'name for 'user' and 'timezone' for 'city',
   //          i e expand records w/o hardcoded column- or field names

   Source = Table.FromRecords(
            {
               [key = 1, user = [id = 10, name = "Wayne Carter"], city = [id = 2, name = "Wuhan", timezone = "China Standard Time"]],
               [key = 2, user = [id = 20, name = "Hugh Jass"], city = [id = 1, name = "Milan", timezone = "Central European Time"]],
               [key = 3, user = [id = 30, name = "Ben Dover"], city = [id = 2, name = "Wuhan", timezone = "China Standard Time"]]
            }),

   //Table controls which attribute to expand
   TransformationTable = Table.FromRecords(
            {
               [field = "user", attribute = "name"],
               [field = "city", attribute = "timezone"]
            }),

   //Transformation table lookup
   AttributeLookup = (parameter as text) =>
   let 
      value = Table.SelectRows(TransformationTable, each ([field] = parameter))[attribute]{0}
   in
      value,

   //These rows are hardcoded for columns 'user' and 'city' - how to make this dynamic?
   ExpandedTable1 = Table.ExpandRecordColumn(Source, "user", {AttributeLookup("user")}, {AttributeLookup("user")}),
   ExpandedTable2 = Table.ExpandRecordColumn(ExpandedTable1, "city", {AttributeLookup("city")}, {AttributeLookup("city")}),

in
   ExpandedTable2

1 Ответ

0 голосов
/ 31 марта 2020

Я думаю, что вы можете использовать что-то вроде приведенного ниже кода для достижения этой цели:

let
    someTable = Table.FromRecords({
        [key = 1, user = [id = 10, name = "Wayne Carter"], city = [id = 2, name = "Wuhan", timezone = "China Standard Time"]],
        [key = 2, user = [id = 20, name = "Hugh Jass"], city = [id = 1, name = "Milan", timezone = "Central European Time"]],
        [key = 3, user = [id = 30, name = "Ben Dover"], city = [id = 2, name = "Wuhan", timezone = "China Standard Time"]]
    }),
    expansionMap = [
        user = {"name"},
        city = {"timezone"}
    ],
    dynamicallyExpanded = List.Accumulate(Record.FieldNames(expansionMap), someTable, (tableState as table, recordColumnName as text) as table =>
        let
            fieldNamesToExpand = Record.Field(expansionMap, recordColumnName),
            fieldNamesAfterExpansion = fieldNamesToExpand,
            expanded = Table.ExpandRecordColumn(tableState, recordColumnName, fieldNamesToExpand, fieldNamesAfterExpansion)
        in expanded
    )
in
    dynamicallyExpanded
  • expansionMap - это record, в котором:
    • имена полей ( т. е. user, city) сопоставляются с именами столбцов, содержащих записи (которые необходимо расширить)
    • значения полей (т. е. {"name"} и {"timezone"}) сопоставляются с вложенными полями (и которые будут в конечном итоге это будут столбцы в развернутой таблице).
  • Все приведенный выше код выполняет l oop над именами полей в expansionMap, итеративно расширяя каждый указанный столбец записи.
  • Имена столбцов в таблице должны быть уникальными, поэтому, если вы, например, указали, что хотите расширить id в столбце записи user и id в столбце записи city, я думаю, что вы ' В конечном итоге я получаю сообщение об ошибке (говорят, что столбец с именем id уже существует). Чтобы предотвратить это, вы можете реализовать некоторые логики c для переименования расширенных столбцов таким образом, чтобы они не соответствовали ни одному из существующих имен столбцов. Например, вы можете изменить соответствующую строку в коде на: fieldNamesAfterExpansion = List.Transform(fieldNamesToExpand, each Text.Combine({recordColumnName, _}, ".")),.

Это не совсем динамически c. То есть вы знаете имена столбцов записей (которые вы хотите расширить) заранее и во время написания кода. Но если я правильно понял ваш вопрос, вы просто хотите представить столбцы записей с помощью некоторой абстрактной структуры - и написать некоторый код, который затем может использовать / обрабатывать эту структуру.

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