Как динамически получать имена столбцов в Excel Power Query - PullRequest
1 голос
/ 04 апреля 2020

Я использую Power Query в Excel для чтения JSON файлов. У меня есть пример рабочего скрипта, как показано ниже:

let
    Source = Json.Document(File.Contents("E:\laureates.json")),
    #"Converted to Table" = Record.ToTable(Source),
    #"Expanded Value" = Table.ExpandListColumn(#"Converted to Table", "Value"),
    #"Expanded Value1" = Table.ExpandRecordColumn(#"Expanded Value", "Value", {"id", "firstname", "surname", "born", "died", "bornCountry", "bornCountryCode", "bornCity", "diedCountry", "diedCountryCode", "diedCity", "gender", "prizes"}, {"Value.id", "Value.firstname", "Value.surname", "Value.born", "Value.died", "Value.bornCountry", "Value.bornCountryCode", "Value.bornCity", "Value.diedCountry", "Value.diedCountryCode", "Value.diedCity", "Value.gender", "Value.prizes"})
in
    #"Expanded Value1"

Второй и третий аргументы выражения для # «Расширенное значение1» содержат имена столбцов, жестко закодированные; этот код генерируется через пользовательский интерфейс.

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

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

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

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Я думаю, вы можете использовать Record.FieldNames для динамического создания этого списка.

Примерно так:

Table.ExpandRecordColumn(
    #"Expanded Value",
    "Value",
    Record.FieldNames([Value]),
    List.Transform(Record.FieldNames([Value]), each "Value." & _)
)

Редактировать: В качестве точек AAsk вышеприведенный синтаксис неверен, поскольку он пытается получить контекст строки в операции на уровне таблицы. Вместо [Value] для каждой строки нам нужно использовать репрезентативную единицу, применяемую ко всему столбцу, и выбрать #"Expanded Value"{0}[Value], запись из первой строки.

Table.ExpandRecordColumn(
    #"Expanded Value",
    "Value",
    Record.FieldNames(#"Expanded Value"{0}[Value]),
    List.Transform(Record.FieldNames(#"Expanded Value"{0}[Value]), each "Value." & _)
)

The List.Transform стоит добавить "Value." к началу имени каждого столбца, но он прекрасно работает, если вместо него дважды использовать Record.FieldNames(#"Expanded Value"{0}[Value]).

0 голосов
/ 05 апреля 2020

Record.FieldNames в вашем ответе (Алексис Олсон) заставил меня осознать, что я могу получить имена столбцов из одной записи ( logi c, что все записи должны иметь одинаковые имена столбцов ). Там код, который динамически получает имена столбцов:

let
Source = Json.Document(File.Contents("E:\laureates.json")),
#"Converted to Table" = Record.ToTable(Source),

#"Expanded Value" = Table.ExpandListColumn(#"Converted to Table", "Value"),
#"Expanded Value1" = Table.ExpandRecordColumn(#"Expanded Value", "Value", 
Record.FieldNames(#"Expanded Value"{0}[Value]),
Record.FieldNames(#"Expanded Value"{0}[Value])
)

в # "Расширенное значение1"

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

...