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

时间:2015-08-19 01:53:58

标签: powerbi powerquery

背景

我需要根据一个锁定在防火墙的PostgreSQL数据库中的数据创建一个Power BI报告/仪表板。不能将Power BI直接连接到DB。但是我可以访问在同一台服务器上运行的Python脚本,因此编写一个简单的提取/转换脚本并将数据显示为XML或JSON是相当简单的。

问题

我是Power BI的新手,我无法弄清楚如何在Power BI桌面中将数据转换为表格

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

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

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

我尝试过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解析它。数据加载,我可以深入到行,但无法弄清楚如何作为一个表读入 - 我最终得到一个列表,一个只有一行的表或一个表的表

1 个答案:

答案 0 :(得分:4)

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

如果您使用Xml.Tables库函数并向下钻取:

,则可以轻松地从XML中获取表格
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创建一个双列表。