Страницы: 1
RSS
Power Query: получить список ключей json, В записях файла json могут встречаться разные наборы ключей. Как преобразовать файл в таблицу, не потеряв ключи
 
Добрый день, уважаемые знатоки Excel!
Я пока только начинаю осваивать Power Query, и не могу найти эффективное решение для моей задачи.
Прошу вашей помощи в оптимизации

Задача следующая:

Дано:
По API получаю json с несложной структурой. Например, такой:
Код
[
    {"Поле1":1,"Поле2":123},
    {"Поле1":1,"Поле2":456,"Поле3":"Текст0"},
    {"Поле1":1,"Поле3":"Текст1"},
    {"Поле1":1}
]
К сожалению, поставщик данных всё время что-нибудь меняет: может изменить имя существующего ключа или добавить новый.

При обычном применении метода Table.ExpandRecordColumn в запрос записываются все имена ключей:
Код
Table.ExpandRecordColumn(JsonToTbl, "Column1", {"Поле1", "Поле2", "Поле3"})

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

Моё решение:
К сожалению, на больших объёмах данных зависает (собственно, это было ожидаемо).
Функция, которая:
0 - получает на вход таблицу записей из json,
1 - заходит в каждую запись, запоминает список ключей,
2 - соединяет все ключи записей в один список,
3 - отбирает уникальные ключи

f_HeadersList (в приложенном файле):
Код
(Tbl as table) as list =>
let
    Rows = Table.RowCount(Tbl),

    // List.Accumulate parameters
    list_numbers = {0 .. Rows-1},
    seed = {},
    fn = (state, current) => state & Record.FieldNames(Tbl{current}[Column1]),

    HeadersList0 = List.Accumulate(list_numbers, seed, fn),
    HeadersList = List.Distinct(HeadersList0)
in
    HeadersList

Прикладываю пример файла json (в архиве) + файл Excel с двумя вариантами запросов (обычный, без использования функции – q_Example00 и с функцией – q_Example01).
Если можно, подскажите, пожалуйста, более изящное и быстродействующее решение.
Спасибо большое, что обратили внимание на мой вопрос!
Изменено: Екатерина Штольц - 30.08.2022 17:06:59
 
Цитата
Екатерина Штольц написал:
0 - получает на вход таблицу записей из json,
1 - заходит в каждую запись, запоминает список ключей,
2 - соединяет все ключи записей в один список,
3 - отбирает уникальные ключи
Сделал то же самое по своему.
Конешно решение не изящное и, возможно, не быстродействующее. Так я этим и не блистал)
Код
let
    Path = Excel.CurrentWorkbook(){[Name="t_Path"]}[Content]{0}[Path],
    FullPath = "D:\загрузкиG_Chrome\Example\" & "Example.json",
    
    GetJson = Json.Document(File.Contents(FullPath)),
    JsonToTbl = Table.FromList(GetJson, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Custom = Table.AddColumn(JsonToTbl, "a", each Record.FieldNames([Column1])),
    Custom1 = List.Distinct( List.Combine(Custom[a])),
    ExpandRecordColumn = Table.ExpandRecordColumn(Custom[[Column1]], "Column1", Custom1)
in
    ExpandRecordColumn
 
Огромное спасибо! Именно то, что я искала: просто, красиво и работает быстро!
 
На кошелек пришли деньги  :D
Не могу узнать от кого, однако спасибо отправителю  :D
Это так веселит и радует  :D
Потрачу на палочку шашлыка  :D
 
Боже мой, разве ж это деньги!  :D
Спасибо Вам, правда ))
Страницы: 1
Наверх