Значение столбца равно элементу списка, если элемент является подстрокой в ​​одном из нескольких столбцов - PullRequest
0 голосов
/ 04 августа 2020

Используя PowerQuery, я хочу создать новый столбец со значением, равным элементу из списка {MED_NAME_LIST}, если этот элемент является подстрокой в ​​одном из нескольких столбцов: [Name], [GenericName], [SimpleGenericName] .

В предыдущем посте я спросил, как выполнять фильтрацию на основании того, содержат ли несколько текстовых столбцов ([Name], [GenericName] или [SimpleGenericName]) подстроку из списка.

Powerquery, содержит ли строка элемент в списке?

Решение сработало хорошо, но теперь я понял, что мне также нужно знать, что такое соответствующий элемент списка.

Назад решение для фильтрации по списку:

    MED_NAME_LIST = {"MEthYlprednisolone", "hYdroxychloroquine", "rEMdesivir"},
    initialTable = Table.FromRows({
        {"Methylprednisolone Tab", "train", "car", "bike"},
        {"no", "no", "no", "no"},
        {"tram", "teleport", "hydroxychloroQuine Tab", "jet"},
        {"no", "no", "no", "yes"},
        {"REMdesivir Tab", "bus", "taxi", "concord"}
    }, type table [Name = text, GenericName = text, SimpleGenericName = text, SomeOtherColumn = text]),
    filtered = Table.SelectRows(initialTable, each List.ContainsAny(
        {[Name], [GenericName], [SimpleGenericName]},
        MED_NAME_LIST,
        (rowValue as text, medicineFromList as text) as logical => Text.Contains(rowValue, medicineFromList, Comparer.OrdinalIgnoreCase)
    ))
in
    filtered```

1 Ответ

0 голосов
/ 04 августа 2020

Custom будет последним совпадением.

Custom.1 будет списком всех совпадений, если их больше одного

let MED_NAME_LIST = {"MEthYlprednisolone", "hYdroxychloroquine", "rEMdesivir"},
initialTable = Table.FromRows({
    {"Methylprednisolone Tab", "train", "car", "bike"},
    {"no", "no", "no", "no"},
    {"tram", "teleport", "hydroxychloroQuine Tab", "jet"},
    {"no", "no", "no", "yes"},
    {"REMdesivir Tab", "bus", "taxi", "concord"}
}, type table [Name = text, GenericName = text, SimpleGenericName = text, SomeOtherColumn = text]),
filtered = Table.SelectRows(initialTable, each List.ContainsAny(
    {[Name], [GenericName], [SimpleGenericName]},
    MED_NAME_LIST,
    (rowValue as text, medicineFromList as text) as logical => Text.Contains(rowValue, medicineFromList, Comparer.OrdinalIgnoreCase)
)),
#"Added Custom" = Table.AddColumn(filtered, "Custom", each List.Accumulate(List.Transform(MED_NAME_LIST, each Text.Lower(_)), null, (state, current) => if Text.Contains(Text.Lower([Name]&[GenericName]&[SimpleGenericName]), current) then current else state)),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom.1", each List.Accumulate(List.Transform(MED_NAME_LIST, each Text.Lower(_)), {}, (state, current) => if Text.Contains(Text.Lower([Name]&[GenericName]&[SimpleGenericName]), current) then List.Combine({{current}, state}) else state))
in #"Added Custom1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...