PowerQuery, как вставить нулевые значения для пропущенных полей, используя Table.FromRecords - PullRequest
0 голосов
/ 16 декабря 2018

Я создаю пользовательский соединитель для PowerBI с помощью PowerQuery SDK, его целью будет считывание данных из JSON через HTTP API и преобразование их в табличное представление.

Я могу читать JSONответ, ответ представляет собой массив объектов JSON.Я использую эту функцию PowerQuery для чтения этого результата в таблицу:

    responseJson = Get30DaysHistory(),
    #"TestTable" = Table.FromRecords(responseJson)
in
   #"TestTable";

Это работает до тех пор, пока все объекты содержат одинаковые поля, но если поля в записи различаются, возникает ошибка.Я пытаюсь понять, как применить эту функцию к моему приведенному выше коду, я просто хочу, чтобы в пропущенных полях были добавлены нулевые значения:

https://docs.microsoft.com/en-us/powerquery-m/missingfield-usenull

вот пример вывода JSON,для добавленного контекста рассматриваемое поле, которое выдает ошибку с этим образцом данных, является "pageId", поскольку оно присутствует в первой записи, но не во второй:

[
{
    "type": "page",
    "uri": "://test/url": {
        "name": "Chrome",
        "version": "69.0.3497",
        "os": "Windows"
    },
    "appId": -323232,
    "pageId": "nVTd9XqSEy1mPhaWGNlW9GWw5gU",
    "ts": 1538768760000,
    "lastTs": 1538768809248,
    "duration": 49248
},
{
    "type": "feature",
    "uri": "://test/url",
    "parsedUserAgent": {
        "name": "Chrome",
        "version": "69.0.3497",
        "os": "Windows"
    },
    "appId": -323232,
    "featureId": "diOobYRaY56e191qW2a7_pXGIzk",
    "ts": 1538768802811
},
{
    "type": "feature",
    "uri": "://test/url",
    "parsedUserAgent": {
        "name": "Chrome",
        "version": "69.0.3497",
        "os": "Windows"
    },
    "appId": -323232,
    "featureId": "_Net3QEcQ2mmg4z9wV95Gqkvx0k",
    "ts": 1538768803809
},
{
    "type": "page",
    "uri": "://test/url",
    "parsedUserAgent": {
        "name": "Chrome",
        "version": "69.0.3497",
        "os": "Windows"
    },
    "appId": -323232,
    "pageId": "cQIxuputqop_FYvfM9ehhd2CUvI",
    "ts": 1538768809248,
    "lastTs": 1538768840412,
    "duration": 31164
}

]

Обновленос решением:

shared Testamun.Contents = (optional message as text) =>
let
    responseJson = Get30DaysHistory("testval"),
    headers =
     let
        allHeaders = List.Combine(List.Transform(responseJson, Record.FieldNames)),
        uniqueHeaders = List.Distinct(allHeaders)
     in
        uniqueHeaders,
        testTable = Table.FromRecords(responseJson, headers, MissingField.UseNull)
 in 
    testTable;

1 Ответ

0 голосов
/ 17 декабря 2018

непроверенная.Написано по телефону, извините за плохой отступ.

Решение / реализация может быть что-то вроде:

responseJson = Get30DaysHistory(),
headers =
    let
        allHeaders = List.Combine(List.Transform(responseJSON, Record.FieldNames)),
        uniqueHeaders = List.Distinct(allHeaders)
    in
        uniqueHeaders,
testTable = Table.FromRecords(responseJson, headers, MissingField.UseNull)
    in
testTable

, хотя предполагается, что responseJson всегда соответствует структуре, показанной в вашем вопросе (т.е.список записей).

Другой способ (хотя я не уверен, какой из них более эффективен / эффективен) может быть:

responseJson = Get30DaysHistory(),
listOfTables = List.Transform(responseJSON, Record.ToTable),
testTable = Table.Combine(listOfTables)
    in
testTable

Если ни один из этих способов не работает для вас, дайте мне знатьи я постараюсь получить доступ к машине, чтобы проверить ваш образец JSON.Удачи.

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