Развернуть переменное количество текстовых тегов из XML источника данных в Excel get & transform - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь использовать функцию получения и преобразования Excel (ранее известную как powerquery) для импорта источника данных XML. Источник данных содержит список тегов b, каждый из которых содержит переменное число тегов d в дочернем элементе c2, например:

<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, для первой строки это общий тип ячейки электронной таблицы, для второй строки это тип таблицы.

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.ExpandTableColumn поскольку (справедливо) жалуется, что bar в первой строке не является таблицей.

Я предполагаю, что автоматическое c преобразование одного тега, содержащего текст, в простую ячейку, а не в таблицу, происходит либо в функции Xml.Tables или ExpandTableColumn. Всплывающая подсказка для Xml.Tables показывает, что у нее есть параметр options, к сожалению, документация для Xml.Tables не дает никаких подробностей об этом параметре options.

Как я могу получить эту вторую строку, расширенную до двух строк, по одной для двух тегов d, содержащихся во втором теге b, имеющих одинаковую строку "fuz" в первом столбце? Такое расширение прекрасно работает, если содержимое тегов d является дополнительным тегом XML, но, очевидно, нет, если теги d содержат только текст.

1 Ответ

1 голос
/ 28 марта 2020

Давайте добавим шаг, чтобы убедиться, что все находится на одном уровне:

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 превращает это:

Screenshot

В более согласованный формат списка:

c1       d
-----------------------
foo     {"bar"}
fuz     {"baz", "quz"}

Затем вы можете развернуть строки без смешанных типов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...