在 Power BI 中解析名称值对列表

Parsing a list of name value pairs in Power BI

背景

我需要根据锁定在防火墙严密的 PostgreSQL 数据库中的数据创建 Power BI report/dashboard。将 Power BI 直接连接到数据库不是一种选择。但是,我可以在同一台服务器上访问 Python 脚本 运行,因此编写一个简单的 extract/transform 脚本并将数据显示为 XML 或 [=36= 是相当简单的].

问题

我是 Power BI 新手,我不知道如何将我的数据转换为 Power BI 桌面中的 tables

这是一个例子 标准销售演示的来源 Table

Month | Count
_____________
Jan   | 100
Feb   | 150
Mar   | 200
...

这就是我在 Power BI 的另一端想要的 table

我试过了JSON:

{
    data: {
        sales: [
                {Jan:100},
                {Feb:150},
                {Mar:200}
               ]
          }
}

而且我试过了 XML:

<root>
    <data>
        <sales>
            <period>
                 <month>Jan</month>
                 <count>100</count>
            </period>
            <period>
                 <month>Feb</month>
                 <count>100</count>
            </period>
            <period>
                 <month>Mar</month>
                 <count>200</count>
            </period>
      </sales>
   </data>
</root>

显然这是我使用的数据的简化版本,但它说明了问题

我尝试使用 UI 解析它。数据加载后,我可以深入到行,但无法弄清楚如何以 table 的形式读入 - 我最终得到的是 table 列表, table 和只有一行或 table 的 tables

Power Query 对键值对数据(M 记录)和表格数据(M table)有不同的表示。

如果您使用 Xml.Tables 库函数并向下钻取,从 XML 中获取 tables 很容易:

let
    Source = Xml.Tables("<root>
    <data>
        <sales>
            <period>
                 <month>Jan</month>
                 <count>100</count>
            </period>
            <period>
                 <month>Feb</month>
                 <count>100</count>
            </period>
            <period>
                 <month>Mar</month>
                 <count>200</count>
            </period>
      </sales>
   </data>
</root>"),
    Table = Source{0}[Table],
    Table1 = Table{0}[Table],
    Table2 = Table1{0}[Table],
    #"Changed Type" = Table.TransformColumnTypes(Table2,{{"month", type text}, {"count", Int64.Type}})
in
    #"Changed Type"

如果您想使用 JSON,您应该将架构更改为单个 JSON 对象,而不是许多对象的列表。

let
    Source = Json.Document("{
    data: {
        sales: [{
                     Jan:100,
                     Feb:150,
                     Mar:200
                 }]
          }
}"),
    data = Source[data],
    sales = data[sales],
    sales1 = sales{0},
    #"Converted to Table" = Record.ToTable(sales1),
    #"Renamed Columns" = Table.RenameColumns(#"Converted to Table",{{"Name", "Month"}, {"Value", "Count"}})
in
    #"Renamed Columns"

Converted to Table 之前的步骤是一条 M 记录,它可能更有用,具体取决于您要用它做什么。您可以使用 Record.ToTable 来制作两列 table.