Powerquery: как вставить строку в таблицу на основе условий в других строках - PullRequest
0 голосов
/ 14 февраля 2020

Я немного поигрался с powerquery, чтобы импортировать все виды файлов и преобразовывать их в удобные таблицы в Excel. Но недавно я наткнулся на проблему, для которой, похоже, я не нашел решения.

После некоторых шагов в моем запросе я, наконец, получил следующий результат:

<table border="1">
 <tr><th>Column 1</th><th>Column 2</th></tr>
 <tr><td>Country</td><td>France</td></tr>
 <tr><td>Number of hits</td><td>10</td></tr>
 <tr><td>Number of misses</td><td>5</td></tr>
 <tr><td>Country</td><td>UK</td></tr>
 <tr><td>Number of hits</td><td>150</td></tr>
 <tr><td>Number of misses</td><td>35</td></tr>
 <tr><td>Country</td><td>Japan</td></tr>
 <tr><td>Number of hits</td><td>5</td></tr>
 <tr><td>Country</td><td>China</td></tr>
 <tr><td>Number of hits</td><td>50</td></tr>
 <tr><td>Number of misses</td><td>3</td></tr>
 </table>

Итак, обычно я всегда ожидал каждый раз, когда строка с «Страна», а затем строка с «хиты», а затем строка с «промахами» (и много другие промежуточные строки, которые мне не нужны, и отфильтрованные в предыдущих шагах).

Но теперь выясняется, что для стран, где число пропусков = 0, нет даже строки, доступной во входном файле , В моем примере это строка для «Japan»

Моя идея заключалась в том, чтобы найти какую-то функцию, которая делает это:

IF < Column1 of current line > ='Number of hits' AND < Column1 of next line > ='Country' THEN insert ['Number of misses','0'] after the current line.

Тогда конечный результат должен выглядеть следующим образом :

<table border="1">
 <tr><th>Column 1</th><th>Column 2</th></tr>
 <tr><td>Country</td><td>France</td></tr>
 <tr><td>Number of hits</td><td>10</td></tr>
 <tr><td>Number of misses</td><td>5</td></tr>
 <tr><td>Country</td><td>UK</td></tr>
 <tr><td>Number of hits</td><td>150</td></tr>
 <tr><td>Number of misses</td><td>35</td></tr>
 <tr><td>Country</td><td>Japan</td></tr>
 <tr><td>Number of hits</td><td>5</td></tr>
 <tr><td><b>Number of misses</b></td><td><b>0</b></td></tr>
  <tr><td>Country</td><td>China</td></tr>
 <tr><td>Number of hits</td><td>50</td></tr>
 <tr><td>Number of misses</td><td>3</td></tr>
 </table>

Все это должно происходить в (расширенной) части запроса, а не после импорта данных в таблицу в Excel.

1 Ответ

0 голосов
/ 14 февраля 2020

Видите, это работает для вас. Предполагается, что исходные данные - это таблица с именем Table1. Вы можете вставить ее в powerquery у себя дома .. расширенный редактор ...

Что он делает (а) создает таблицу уникальных описаний из столбца 1 (б) создает таблицу уникальные имена стран из столбца 2 (c) создают все комбинации из двух (d) объединяет исходные данные обратно, и все пропущенные автоматически становится нулем, который мы можем заменить на ноль

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],

// create table of all unique descriptions
#"Removed Duplicates" = Table.Distinct(Source, {"Column 1"}),
#"Select" = Table.FromList(Table.Column(#"Removed Duplicates" ,"Column 1")),
#"Added Custom1" = Table.AddColumn(#"Select", "Custom", each 1),

// create table of all unique countries
#"Filtered Rows" = Table.SelectRows(Source, each ([Column 1] = "Country")),
#"Select2" = Table.FromList(Table.Column(#"Filtered Rows" ,"Column 2")),
#"Removed Duplicates1" = Table.Distinct(Select2),
#"Added Custom" = Table.AddColumn(#"Removed Duplicates1", "Custom", each 1),

// create all possible combinations of description x countries
#"Merged Queries" = Table.NestedJoin(#"Added Custom",{"Custom"},#"Added Custom1" ,{"Custom"},"Table3",JoinKind.FullOuter),
#"Expanded Table3" = Table.ExpandTableColumn(#"Merged Queries", "Table3", {"Column1"}, {"Column1.1"}),

// create table to compare to
#"Added Custom2" = Table.AddColumn(Source, "Fill", each if [Column 1]="Country" then [Column 2] else null),
#"Filled Down" = Table.FillDown(#"Added Custom2",{"Fill"}),

// merge compare table onto combination table. Anything missing comes up as null. Then replace nulls with 0
#"Merged Queries1" = Table.NestedJoin(#"Expanded Table3",{"Column1.1", "Column1"},#"Filled Down",{"Column 1", "Fill"},"Table4",JoinKind.LeftOuter),
#"Expanded Table4" = Table.ExpandTableColumn(#"Merged Queries1", "Table4", {"Column 2"}, {"Column 2"}),
#"Replaced Value" = Table.ReplaceValue(#"Expanded Table4",null,0,Replacer.ReplaceValue,{"Column 2"}),
#"Removed Columns" = Table.RemoveColumns(#"Replaced Value",{"Column1", "Custom"})

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