首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非结构化键值对数据转换为表

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

Stack Overflow用户
提问于 2015-12-01 18:17:56
回答 2查看 748关注 0票数 1

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

代码语言:javascript
复制
ValA=101
ValB=2938
ValA=998
ValB=387
ValA=876
ValB=9832

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

代码语言:javascript
复制
ValA        ValB
101         2938
998         387
.......
.......

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

你知道如何在powerquery中轻松实现这一点吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-12-02 00:09:27

我最终做了和Lukasz完全一样的事情,下面是完整的代码:

代码语言:javascript
复制
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使用pivot列的第二个想法如下所示:

代码语言:javascript
复制
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

我发现的诀窍是添加除以2的索引列(即0,0,1,1,2,2...)所以透视表知道前两行应该是相关的,接下来的两行应该是相关的,依此类推。

票数 3
EN

Stack Overflow用户

发布于 2015-12-02 00:03:51

您可以执行以下操作:

1)使用如下逻辑创建两个新的计算列: if column1 contains ValA then Column1 else null。第二列中的ValB也有相同的逻辑。

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

3)使用筛选功能筛选出两个新列中包含空值的行

这应该会给你你想要的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34017874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档