如何使用 Power Query 编辑器在 Office Excel 中正确显示数据?

Ank*_*hah 5 excel m office365 powerquery powerbi

我有以下来自 API 的 JSON 输出,在 Office Excel 中,我从 API 通过 Web 导入数据。

   [{
        "level": 1,
        "children": [{
            "level": 2,
            "children": [{
                "level": 3,
                "name": "Chandni Chowk",
                "data": ["Data 1", "Data 2"]
            }],
            "name": "Delhi",
            "data": ["Delhi Area"]
        }],
        "name": "Country",
        "data": ["India", "Bangladesh"]
    }]
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/en-us/powerquery-m/quick-tour-of-the-power-query-m-formula-language

我有上面的文件。

let
    Source = Json.Document(Web.Contents("MY API URL GOES HERE")),
    AsTable = Table.FromRecords(Source)
    ----
    ----
in
    #"Renamed Column2" 
Run Code Online (Sandbox Code Playgroud)

在电源查询编辑器中,我现在有这个。

作为 Excel 文件中的输出,我需要这样。

Country       Delhi          Chandni Chowk         
India         Delhi Area     Data 1
Bangladesh                   Data 2
Run Code Online (Sandbox Code Playgroud)

我可以从此 JSON 获取此数据,还是需要更改与电源查询匹配的 JSON 输出格式?

Ale*_*son 3

Power Query 将 JSON 解释为记录和列表的层次结构。我的目标是将 JSON 扁平化为这样的记录,然后将其转换为表:

      Country : {"India", "Bangladesh"}
        Delhi : {"Delhi Area"}
Chandni Chowk : {"Data 1", "Data 2"}
Run Code Online (Sandbox Code Playgroud)

在任何特定级别,我们可以使用Record.FromList提取名称和数据值:

Record.FromList({CurrentLevel[data]}, {CurrentLevel[name]})
Run Code Online (Sandbox Code Playgroud)

对于第一级,这是

Record.FromList({{"India","Bangladesh"}}, {"Country"})
Run Code Online (Sandbox Code Playgroud)

它对应于进球记录中的第一个字段。


在任何级别,我们都可以像这样导航到下一个级别:

NextLevel = CurrentLevel[children]{0}
Run Code Online (Sandbox Code Playgroud)

使用这些构建块,我们现在可以编写一个自定义函数Expand来展平记录:

1 |    (R as record) as record =>
2 |    let
3 |        ThisLevel = Record.FromList({R[data]}, {R[name]}),
4 |        CombLevel = if Record.HasFields(R, {"children"})
5 |                    then Record.Combine({ThisLevel, @Expand(R[children]{0})})
6 |                    else ThisLevel
7 |    in
8 |        CombLevel
Run Code Online (Sandbox Code Playgroud)

第 1 行:定义函数的语法。它需要一条记录R并在进行一些转换后返回一条记录。

第3行:如何处理当前级别,如前所述。

第 4 行:检查记录是否还有可以向下扩展的级别。

第 5 行:如果是,则Record.Combine当前级别的结果与下一个级别的结果,其中下一个级别的结果是通过导航到下一个级别并递归应用我们定义的函数来计算的。具有三个级别,如下所示:

Record.Combine({Level1, Record.Combine({Level2, Level3})})
Run Code Online (Sandbox Code Playgroud)

第 6 行:当没有更多级别可扩展时,递归停止。不再有任何组合,仅返回最后一个级别。


剩下的就是将其转变成我们想要的形状。这是使用我们刚刚定义的 Expand 函数进行的查询:

let
    Source = Json.Document( < JSON Source > ),
    ExpandRecord = Expand(Source{0}),
    ToTable = Table.FromColumns(
                  Record.FieldValues(ExpandRecord),
                  Record.FieldNames(ExpandRecord)
              )
in
    ToTable
Run Code Online (Sandbox Code Playgroud)

这使用Record.FieldValuesRecord.FieldName作为Table.FromColumns中的参数。

如果您选择第一个列表单元格,则使用自定义函数后的步骤Expand在查询编辑器中如下所示:

记录

最终的结果就是你所要求的:

结果