Создать условный столбец в Power Query на основе значения списка - PullRequest
0 голосов
/ 18 января 2020

Я хочу создать условный столбец в Excel Power Query, который ищет список компаний и возвращает значение типа «Да», если столбец компании в данной строке соответствует одной из компаний в списке.

Это должно выглядеть примерно так:

+----------+---------------------+-------+
| Company  |        List         | Match |
+----------+---------------------+-------+
| Apple    | Facebook, Instagram | No    |
| Facebook | Facebook, Instagram | Yes   |
+----------+---------------------+-------+

Ограничение: я не могу создать дополнительные строки, так как таблица Excel будет использоваться для импорта информации в систему, и поэтому должна быть структурирована заданным образом. ,

Я попытался использовать встроенную функцию условного столбца в Power Query, но он может просматривать только определенный столбец c, а не несколько. И он видит столбец списка компаний в виде большой строки, такой как «Facebook, Instagram», а не отдельных значений. Кроме того, список компаний очень длинный, поэтому было бы очень неэффективно создавать операторы if для каждой компании.

What I have tried

Любая помощь будет принята с благодарностью !

Ответы [ 2 ]

1 голос
/ 18 января 2020

Если ваша исходная таблица выглядит примерно так:

Initial table

, тогда этот код:

let
    initialTable = Table.FromColumns({{"Apple", "Facebook"}, {"Facebook, Instagram", "Facebook, Instagram"}}, type table [Company = text, List = text]),
    matchColumn = Table.AddColumn(initialTable, "Match", each List.Contains(Text.Split([List], ", "), [Company]), type logical)
in
    matchColumn

должен дать ожидаемый результат:

Output table

  • Я разделил список компаний по разделителю , (после запятой есть пробел), поскольку именно это Вы показали в своем вопросе. Вы можете изменить код на ,, если пробела нет.
  • Я использовал true / false (вместо "YES" / "NO").
  • Если любое из названий компаний содержит запятые (то есть запятые, которые следует интерпретировать буквально, а не как разделители), вы можете получить неожиданное поведение / вывод. Splitter.SplitTextByDelimiter может помочь вернуть лучшую функцию расщепления, но для этого требуется, чтобы ваши значения уже были в кавычках (которых они не представляют).

В качестве альтернативы попробуйте:

let
    initialTable = Table.FromColumns({{"Apple", "Facebook"}, {"Facebook, Instagram", "Facebook, Instagram"}}, type table [Company = text, List = text]),
    matchColumn = Table.AddColumn(initialTable, "Match", each if List.Contains(Text.Split([List], ", "), [Company]) then "AB119" else "AD119", type text)
in
    matchColumn
0 голосов
/ 08 апреля 2020

Привет, просто чтобы проверить, я правильно понимаю - у вас есть список приложений и известный список компаний?

Если это так, вы можете попробовать:

if
List.AnyTrue(List.Transform({
"Instagram",
"Facebook",
"WhatsApp"
}
,(substring) => Text.Contains([List],substring,Comparer.OrdinalIgnoreCase)))

then "Facebook"

else if

//then repeat for list of other company products 

else "No Company"

Хотя, пожалуйста, обратите внимание этот метод ограничен по порядку - т. е. если в столбце [Список] содержатся приложения и продукты Apple и Facebook, он будет обозначать только первую компанию, указанную в вашем запросе.

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