【问题标题】:Power Query - extracting data from nested listsPower Query - 从嵌套列表中提取数据
【发布时间】:2021-05-21 05:00:43
【问题描述】:

我有几个JSON files 需要在电源查询中组合。曾经的文件具有相同的结构,需要进行透视。这里是link to the files

我很苦恼,因为每个文件都有一个包含记录列表的列,这会阻止电源查询旋转表。

这是查询编辑器中的两个屏幕截图,我只需从列表中提取“landing_points.name”并将整个表格转换为类似于第二个屏幕截图的格式。

我该怎么做?非常感谢任何帮助!

以下是我使用的代码,并收到此错误消息

“转换文件”查询中出现错误。 Expression.Error:我们无法将 List 类型的值转换为 Record 类型。 细节: 值=[列表] 类型=[类型]

Row 93 error reference

let
Source = Folder.Files("C:\Users\ldu\Desktop\Subsea"),
#"Filtered Hidden Files1" = Table.SelectRows(Source, each [Attributes]?[Hidden]? <> true),
#"Invoke Custom Function1" = Table.AddColumn(#"Filtered Hidden Files1", "Transform File", each #"Transform File"([Content])),
#"Renamed Columns1" = Table.RenameColumns(#"Invoke Custom Function1", {"Name", "Source.Name"}),
#"Removed Other Columns1" = Table.SelectColumns(#"Renamed Columns1", {"Source.Name", "Transform File"}),
#"Expanded Table Column1" = Table.ExpandTableColumn(#"Removed Other Columns1", "Transform File", Table.ColumnNames(#"Transform File"(#"Sample File"))),
#"Changed Type" = Table.TransformColumnTypes(#"Expanded Table Column1",{{"Source.Name", type text}, {"Name", type any}, {"Value", type any}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
#"Integer-Divided Column" = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, 9), Int64.Type}}),
#"Pivoted Column" = Table.Pivot(#"Integer-Divided Column", List.Distinct(#"Integer-Divided Column"[Name]), "Name", "Value")

在 #“透视列”

Nested lists

Extracted if just pulling one file

【问题讨论】:

标签: powerquery m


【解决方案1】:

试试这个

我们创建一个索引。使用整数除以按文件名分组。枢。展开列表,然后从记录中拉出名称字段

let Source = Folder.Files("C:\Users\ldu\Desktop\Subsea"),
#"Filtered Hidden Files1" = Table.SelectRows(Source, each [Attributes]?[Hidden]? <> true),
#"RecordToTable" = Table.AddColumn(#"Filtered Hidden Files1", "Transform File from Query1", each Record.ToTable(Json.Document([Content]))),
#"Removed Other Columns" = Table.SelectColumns(RecordToTable,{"Name", "Transform File from Query1"}),
#"Expanded Transform File from Query1" = Table.ExpandTableColumn(#"Removed Other Columns", "Transform File from Query1", {"Name", "Value"}, {"Name1", "Value"}),
#"Added Index" = Table.AddIndexColumn(#"Expanded Transform File from Query1", "Index", 0, 1),
#"Integer-Divided Column" = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, 9), Int64.Type}}),
#"Pivoted Column" = Table.Pivot(#"Integer-Divided Column", List.Distinct(#"Integer-Divided Column"[Name1]), "Name1", "Value"),
#"Expanded landing_points" = Table.ExpandListColumn(#"Pivoted Column", "landing_points"),
#"ExtractName" = Table.TransformColumns(#"Expanded landing_points",{{"landing_points", each   Record.Field(_,"name"), type text}})
in  #"ExtractName"

如果这仍然不起作用,请尝试在枢轴之前进行扩展

let Source = Folder.Files("C:\Users\ldu\Desktop\Subsea"),
#"RecordToTable" = Table.AddColumn(Source, "Transform File from Query1", each Record.ToTable(Json.Document([Content]))),
#"Removed Other Columns" = Table.SelectColumns(RecordToTable,{"Name", "Transform File from Query1"}),
#"Expanded Transform File from Query1" = Table.ExpandTableColumn(#"Removed Other Columns", "Transform File from Query1", {"Name", "Value"}, {"Name1", "Value"}),
#"Added Index" = Table.AddIndexColumn(#"Expanded Transform File from Query1", "Index", 0, 1),

// extract and combine landing points locations
#"Filtered Rows" = Table.SelectRows(#"Added Index", each [Name1] = "landing_points"),
#"Expanded Value" = Table.TransformColumns(Table.ExpandListColumn(#"Filtered Rows", "Value"),{{"Value", each Record.Field(_,"name"), type text}}),
Places = Table.Group(#"Expanded Value", {"Name","Index","Name1"}, {{"Value", each Text.Combine([Value],"|"), type text}}),

Recombined = Table.Sort(Table.Combine({Table.SelectRows(#"Added Index", each [Name1] <> "landing_points"), Places }),{{"Index", Order.Ascending}}),

#"Integer-Divided Column" = Table.TransformColumns(Recombined  , {{"Index", each Number.IntegerDivide(_, 9), Int64.Type}}),
#"Pivoted Column" = Table.Pivot(#"Integer-Divided Column", List.Distinct(#"Integer-Divided Column"[Name1]), "Name1", "Value"),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Pivoted Column", {{"landing_points", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "landing_points")
in #"Split Column by Delimiter"

【讨论】:

  • 谢谢,但我收到以下错误。我应该用什么代替“价值”?再次感谢 Expression.Error:找不到表的“值”列。细节:价值
  • 您的示例屏幕截图清楚地显示 Value 作为列名,所以我不知道是什么问题。尝试按照我给出的步骤而不是直接复制代码,它会为你构建代码
  • 谢谢,我按照步骤操作,但在执行列透视后出现以下错误(不聚合)“转换文件”查询中发生错误。 Expression.Error:我们无法将 List 类型的值转换为 Record 类型。详细信息:值=[列表] 类型=[类型]
  • 编辑问题,发布代码,如果可能,将源文件数据的副本以 excel 格式发布到某个地方,并发布指向该文件的链接
  • 谢谢。我将代码和超链接添加到文件(原始来源)。我不知道我可以在哪里发布文件并链接回这里,但稍后会调查一下......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多