将非结构化键值对数据转换为表

时间:2015-12-01 10:17:56

标签: powerbi powerquery

我有以下格式的数据,示例如下所示:

ValA=101
ValB=2938
ValA=998
ValB=387
ValA=876
ValB=9832

我知道每套ValA& ValB是一组属于一起的值,因此输出将为:

ValA        ValB
101         2938
998         387
.......
.......

我需要将其转换为表格格式,以便每个valA ValB对都是一行。 我已经尝试在powerquery中执行此操作,方法是拆分=符号,然后转动Val名称,但它不起作用。

关于如何在powerquery中轻松实现这一点的任何想法? 谢谢!

2 个答案:

答案 0 :(得分:3)

我最终做的与Lukasz完全相同,这是完整的代码:

let
    Source = "ValA=101
ValB=2938
ValA=998
ValB=387
ValA=876
ValB=9832",
    Custom1 = Lines.FromText(Source),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitTextByDelimiter("="), null, null, ExtraValues.Error),
    ChangedType = Table.TransformColumnTypes(#"Converted to Table",{{"Column1", type text}, {"Column2", Int64.Type}}),
    CustomA = Table.AddColumn(ChangedType, "ValA", each if [Column1] = "ValA" then [Column2] else null),
    CustomB = Table.AddColumn(CustomA, "ValB", each if [Column1] = "ValB" then [Column2] else null),
    FilledDown = Table.FillDown(CustomB,{"ValA"}),
    FilteredRows = Table.SelectRows(FilledDown, each [ValB] <> null)
in
    FilteredRows

Lukasz使用枢轴列的第二个想法如下:

let
    Source = "ValA=101
ValB=2938
ValA=998
ValB=387
ValA=876
ValB=9832",
    Custom1 = Lines.FromText(Source),
    #"Converted to Table" = Table.FromList(Custom1, Splitter.SplitTextByDelimiter("="), null, null, ExtraValues.Error),
    ChangedType = Table.TransformColumnTypes(#"Converted to Table",{{"Column1", type text}, {"Column2", Int64.Type}}),
    AddedIndex = Table.AddIndexColumn(ChangedType, "Index", 0, 1),
    IntegerDividedColumn = Table.TransformColumns(AddedIndex, {{"Index", each Number.IntegerDivide(_, 2), Int64.Type}}),
    PivotedColumn = Table.Pivot(IntegerDividedColumn, List.Distinct(IntegerDividedColumn[Column1]), "Column1", "Column2")
in
    PivotedColumn

我发现的技巧是添加二分词索引列(分别为0,0,1,1,2,2 ......),因此枢轴知道前两行应该是相关的,而下一行二,等等。

答案 1 :(得分:1)

您可以执行以下操作:

1)使用逻辑创建两个新的计算列,如果column1包含ValA,则Column1为null。第二栏中ValB的逻辑相同。

2)使用最左侧列的填充功能。这将生成具有不同列中的ValA和ValB值的行

3)使用过滤器功能过滤掉两个新列中具有空值的行

那可以给你你想要的东西。

编辑:考虑到这一点你也可以尝试:在等号上拆分column1。然后转动新列,它应该生成两列具有离散值的列。 HTH。