在 Excel get&transform 中扩展来自 XML 数据源的可变数量的文本标签
Expand variable number of text tags from XML data source in Excel get&transform
我正在尝试使用 Excel 的获取和转换功能(以前称为 powerquery)来导入 XML 数据源。数据源有一个 b
标签列表,每个标签在 c2
个子标签中具有可变数量的 d
标签,例如:
<a>
<b>
<c1>foo</c1>
<c2>
<d>bar</d>
</c2>
</b>
<b>
<c1>fuz</c1>
<c2>
<d>baz</d>
<d>quz</d>
</c2>
</b>
</a>
当我使用以下查询导入此数据时,列 c2.d 的数据类型对于代表 b
项的两个不同行是不同的,对于第一行,它是一个通用电子表格单元格类型,第二行是 Table 类型。
let
Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
Table0 = Source{0}[Table],
#"Changed Type" = Table.TransformColumnTypes(Table0,{{"c1", type text}}),
#"Expanded c2" = Table.ExpandTableColumn(#"Changed Type", "c2", {"d"}, {"c2.d"})
in
#"Expanded c2"
对于第一行,它似乎自动将 d
标记转换为一个简单的电子表格单元格,因为只有一个,而且它只包含文本。然而,对于第二行,它看到有两个 d
标签,因此将其保留为 table。现在的问题是我既不能按原样加载数据,因为第二行中的 Table 被加载到电子表格中作为文字字符串 "Table"
让我没有实际数据,也不能进一步扩展Table 使用 Table.ExpandTableColumn
因为它(正确地)抱怨第一行的 bar
不是 table.
我假设在 Xml.Tables
或 ExpandTableColumn
函数中会自动将包含文本的单个标记自动转换为简单单元格而不是 table。 Xml.Tables
的工具提示显示它有一个 options
参数,不幸的是 documentation for Xml.Tables
没有给出这个 options
参数的任何细节。
我怎样才能将第二行扩展为两行,第二个 b
标签中包含的两个 d
标签各一行,其中具有相同的 "fuz"
字符串第一栏?如果 d
标签的内容是进一步的 XML 标签,这样的扩展工作正常,但如果 d
标签只包含文本,则显然不行。
让我们添加一个步骤以确保所有内容都处于同一级别:
let
Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
Table0 = Source{0}[Table],
Expandc2 = Table.ExpandTableColumn(Table0, "c2", {"d"}, {"d"}),
ToLists = Table.TransformColumns(Expandc2,
{"d", each if _ is table then Table.ToList(_) else {_}}),
ExpandLists = Table.ExpandListColumn(ToLists, "d")
in
ExpandLists
ToLists
步骤变成这样:
转换为更一致的列表格式:
c1 d
-----------------------
foo {"bar"}
fuz {"baz", "quz"}
然后您可以扩展到没有混合数据类型的行。
我正在尝试使用 Excel 的获取和转换功能(以前称为 powerquery)来导入 XML 数据源。数据源有一个 b
标签列表,每个标签在 c2
个子标签中具有可变数量的 d
标签,例如:
<a>
<b>
<c1>foo</c1>
<c2>
<d>bar</d>
</c2>
</b>
<b>
<c1>fuz</c1>
<c2>
<d>baz</d>
<d>quz</d>
</c2>
</b>
</a>
当我使用以下查询导入此数据时,列 c2.d 的数据类型对于代表 b
项的两个不同行是不同的,对于第一行,它是一个通用电子表格单元格类型,第二行是 Table 类型。
let
Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
Table0 = Source{0}[Table],
#"Changed Type" = Table.TransformColumnTypes(Table0,{{"c1", type text}}),
#"Expanded c2" = Table.ExpandTableColumn(#"Changed Type", "c2", {"d"}, {"c2.d"})
in
#"Expanded c2"
对于第一行,它似乎自动将 d
标记转换为一个简单的电子表格单元格,因为只有一个,而且它只包含文本。然而,对于第二行,它看到有两个 d
标签,因此将其保留为 table。现在的问题是我既不能按原样加载数据,因为第二行中的 Table 被加载到电子表格中作为文字字符串 "Table"
让我没有实际数据,也不能进一步扩展Table 使用 Table.ExpandTableColumn
因为它(正确地)抱怨第一行的 bar
不是 table.
我假设在 Xml.Tables
或 ExpandTableColumn
函数中会自动将包含文本的单个标记自动转换为简单单元格而不是 table。 Xml.Tables
的工具提示显示它有一个 options
参数,不幸的是 documentation for Xml.Tables
没有给出这个 options
参数的任何细节。
我怎样才能将第二行扩展为两行,第二个 b
标签中包含的两个 d
标签各一行,其中具有相同的 "fuz"
字符串第一栏?如果 d
标签的内容是进一步的 XML 标签,这样的扩展工作正常,但如果 d
标签只包含文本,则显然不行。
让我们添加一个步骤以确保所有内容都处于同一级别:
let
Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
Table0 = Source{0}[Table],
Expandc2 = Table.ExpandTableColumn(Table0, "c2", {"d"}, {"d"}),
ToLists = Table.TransformColumns(Expandc2,
{"d", each if _ is table then Table.ToList(_) else {_}}),
ExpandLists = Table.ExpandListColumn(ToLists, "d")
in
ExpandLists
ToLists
步骤变成这样:
转换为更一致的列表格式:
c1 d
-----------------------
foo {"bar"}
fuz {"baz", "quz"}
然后您可以扩展到没有混合数据类型的行。