Страницы: 1
RSS
Power Query поиск и подстановка данных из одной таблицы в другую по условию., поиск и подставновка в Power Query
 

Уважаемые знатоки!

Задача:

1.     В таблице Дано необходимо найти все предложения содержащие слова из таблицы Условия.

2.     На основе таблицы Дано создать таблицу Решение и поставить в нее на основе поиска по п.1 значения из поля Выбор таблицы Условия.

Большая просьба оказать содействие в решении задачи или, хотя бы подсказать, где можно почитать (посмотреть) что-то по поводу решения данной задачи.

Решение хотелось бы видеть в PQ в простом и понятном виде.

1 приз гарантирую.

Скрин задачи и подготовленный Эксел прилагаю.

Всем заранее большое спасибо за любую помощь и любые ответы!

 
Доброе время суток.
Вариант.
Код
let
    source = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
    splitToWords = Table.AddColumn(source, "word", each Text.Split([Наименование], " ")),
    expandList = Table.ExpandListColumn(splitToWords, "word"),
    selector = Table.PrefixColumns(Excel.CurrentWorkbook(){[Name="Условия"]}[Content], "f"),
    join = Table.Join(expandList, {"word"}, selector, {"f.Наименование"}, JoinKind.LeftOuter),
    result = Table.Group(join, {"Наименование"}, {{"Выбор", each List.Max(_[f.Выбор])}})
in
    result
 
Спасибо большое щас посмтрю!
Изменено: Альбертус - 08.11.2023 15:31:46
 
Альбертус, на основе какой логики напротив "три четыре пять" оказалась единица, а не ноль или двойка?
ну ладно, если старшие товарищи пишут List.Max, то и мы тоже
Код
let
    дано = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
    условия = Excel.CurrentWorkbook(){[Name="Условия"]}[Content],
    cnd_rec = Record.FromList(условия[Выбор], условия[Наименование]),
    f = (txt as text) =>
        [lst = Text.Split(txt, " "),
        txform = List.Max(List.Transform(lst, (x) => Record.FieldOrDefault(cnd_rec, x, null)))][txform],
    result = Table.AddColumn(дано, "Выбор", each f([Наименование]))
in
    result
Изменено: Alien Sphinx - 08.11.2023 15:57:03
Пришелец-прораб.
 

Уважаемый Андрей большое спасибо!

По поводу благодарности отписал Вам в личку…

Ваше решение красивое и компактное!

Я полагаю , что я упустил не точно сформулировал задачу.

В реальной задаче нужен поиск не только по всему слову но даже по части слова.

Можно ли адаптировать решение под такое условие?

Заранее большое спасибо!

 
Уважаемый Alien Sphinx!
Спасибо за Ваше решение все работает но мне с моим уровнем сложно понять там все.
Если не сложно не могли бы комментами описать шаги в тексте плиз?
И также вопрос будет ли такая процедура искать по части слова?
Нужен поиск как по всему слову так и по части (содержит).
Заранее спасибо за любой ответ!
 
Цитата
Альбертус написал:
будет ли такая процедура искать по части слова?
нет, не будет. Вот эта будет, но и ответ будет другой.
Код
let
    дано = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
    условия = Excel.CurrentWorkbook(){[Name="Условия"]}[Content],
    result = 
        Table.AddColumn(
            дано, "Выбор", 
            (x) => 
                List.Max(
                    Table.SelectRows(
                        условия, 
                        (w) => Text.Contains(x[Наименование], w[Наименование])
                    )[Выбор]
                )
        )
in
    result
Пришелец-прораб.
 
Цитата
Альбертус написал:
Можно ли адаптировать решение под такое условие?
Можно, вариант.
Код
let
    source = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
    selector = List.Buffer(Table.ToRecords(Excel.CurrentWorkbook(){[Name="Условия"]}[Content])),
    result = Table.AddColumn(source, "Выбор", (rec) =>
    [
        value = List.Accumulate(selector, -100500, (state, current) => 
        if Text.Contains(rec[Наименование], current[Наименование]) then
            if current[Выбор] > state then current[Выбор] else state
        else
            state
        ),
        result = if value = -100500 then null else value
    ][result])
in
    result

Цитата
Альбертус написал:
отписал Вам в личку…
Не стоит, не читаю.
 

Цитата
написал:
Альбертус , на основе какой логики напротив "три четыре пять" оказалась единица, а не ноль или двойка?ну ладно, если старшие товарищи пишут List.Max, то и мы тоже

Реальная задача (Задача) не имеет ничего общего с текстом из примера.

В Задаче целые связанные предложения и бывает что большие и искать надо как по целому слову так и по части слова.

Я просто не смог сгенерировать простой и понятный пример.

1 и 0 (да/нет) выбирается руками исходя из смысла после прочтения каждой записи.

 
Трудно передать словами мою благодарность Вам!
Друзья всем огромное спасибо за помощь щас изучу и попробую разобраться!
 
Сильно извиняюсь я похоже жестко тупанул и поставил взаимоисключающие условия когда и Да и НЕТ должны быть одновременно а так не бывает (((
Буду думать как переформулировать.
Простите меня ПОЖАЛУЙСТА!
 

Друзья, само корректное переформулирование задачи с примером,

в силу моей низкой квалификации уже далось очень непросто.

Повторно сформулировал и прошу Вас ее посмотреть на предмет решения.

В Таблице Дано необходимо найти предложения содержащие слова или часть слова из таблицы Условия.

На основании выбора из таблицы Условия в таблицу Решения подставить выбор типа 1 или 0 (да/нет).

То есть, надо найти и отразить в Решении все совпадения в виде 1 или 0.

Теоретически могут быть противоречия в Условиях, поэтому в Решении стоят именно 2 поля Выбор0 и Выбор1.

Эксел прикладываю повторно.

Всем огромное спасибо!

Изменено: Альбертус - 08.11.2023 19:51:26
 
Альбертус, вам уже 4 варианта кода предоставили. И с точным совпадением и с частичным. Почему бы вам не попробовать адаптировать какое-то из них под ваши новые условия? Тем более, что я ниче в них не понял  :) Если кому-то интересно здесь за вас решить эту задачу - никто запрещать не будет, а я что-то подустал ((( Может вам в Работу, раз уж сами не можете?
Пришелец-прораб.
 
Alien Sphinx, от меня не набирайтесь, как тут недавно сказали, «желчи» :)
А то я прям реально стал всех ругать, что даже задачу не понимают (Альбертус это не к Вам претензия), не то что решение хоть в общих чертах, а просят сделать :)
Но тут, вроде, по делу. Можно бесконечно допиливать решение под хотелки, но в разделе Работа.
 
я сильно признателен Вам за все решения и уделенное!
все варианты я изучу изучаю но сам я скомбинировать и решить пока не могу по понятым причинам.
а то что с первого раза не смог сформулировать так это сам лох мозгов не хватило.
приношу извинения за отнятое время и еще раз большое спасибо за помощь я ее сильно ценю!
но на самом деле я уверен что такая задача интересна практически всем чайникам типа меня.
за совет тоже спасибо!.
 
Цитата
Альбертус написал:
В Таблице Дано необходимо найти предложения содержащие слова или часть слова из таблицы Условия.
я вот здесь завис. Допустим, в дано есть предложение из 1 слова "пять". А в условиях есть "шесть". Везде есть "ть". Совпадение, не находите? В остальном со скрипом, но понятно.
surkenny, пока не дождусь "душный и токсичный" от ТСов - не успокоюсь  :D
Изменено: Alien Sphinx - 08.11.2023 21:04:54
Пришелец-прораб.
 
Вариант
Код
let
    source = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
    selector = List.Buffer(Table.ToRecords(Excel.CurrentWorkbook(){[Name="Условия"]}[Content])),
    result = Table.AddColumn(source, "Выбор", (rec) =>
    [
        values = List.Accumulate(selector, {null, null}, (state, current) => 
        if Text.Contains(rec[Наименование], current[Наименование]) then
            List.ReplaceRange(state, current[Выбор], 1, {current[Выбор]})
        else
            state
        ),
        result = Record.FromList(values, {"Выбор0", "Выбор1"})
    ][result]),
    return = Table.ExpandRecordColumn(result, "Выбор", {"Выбор0", "Выбор1"})
in
    return
 
Цитата
написал:
let
   source = Excel.CurrentWorkbook(){[Name="Дано"]}[Content],
   selector = List.Buffer(Table.ToRecords(Excel.CurrentWorkbook(){[Name="Условия"]}[Content])),
   result = Table.AddColumn(source, "Выбор", (rec) =>
   [
       values = List.Accumulate(selector, {null, null}, (state, current) =>
       if Text.Contains(rec[Наименование], current[Наименование]) then
           List.ReplaceRange(state, current[Выбор], 1, {current[Выбор]})
       else
           state
       ),
       result = Record.FromList(values, {"Выбор0", "Выбор1"})
   ][result]),
   return = Table.ExpandRecordColumn(result, "Выбор", {"Выбор0", "Выбор1"})
in
   return
Андрей VG, емае я не представляю как вы это все делаете но буду стараться изучать Ваш опыт!
Огромное Вам спасибо, низкий поклон и еще раз прошу Вас в личке сообщить мне координаты для благодарности.
Я очень ценю вашу щедрость и доброту но в данном случае был заложен приз 500р и он совершенно точно Ваш!
Страницы: 1
Наверх