Страницы: 1
RSS
Power Query. Сформировать список по пересечению
 
Добрый день!
Исходная таблица эксель из одной колонки [Столбец1] с 6 строками:
[Столбец1]
1: А
2: А, Б
3: Б, Г
4: Д
5: В, Д
6: Е

Необходимо преобразовать по принципу пересечения букв в следующий вид (порядок строк не принципиален, также допускается, что это может быть 3 записи List)
1: А, Б, Г
2: В, Д
3: Е

Логика: буквы в 1 и 2 строке объединяются, т.к. А из 1й строки есть во 2й строке. Получившееся значение "А, Б" пересекается с 3 строкой "Б, Г", потому что имеет общую букву Б. В остальных строках нет букв А, Б, Г, поэтому получилось значение "А, Б, Г". И т.д.

Я разбила исходный столбец на списки с помощью Text.SplitAny([Столбец1],",")). Понимаю, что нужно действовать через List.Intersect и List.Union, но написать функцию или запрос никак не получается.
Помогите, пожалуйста!!!!!
 
<неудачно, удаляю>
Изменено: AlienSx - 28.03.2024 15:37:41
Пришелец-прораб.
 
Вот такое решение получилось. Не уверена что оптимально, но может кому пригодится.
Ну, и буду благодарна гуру за более оптимальное решение.
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}}),
    #"Замененное значение" = Table.ReplaceValue(#"Измененный тип"," ","",Replacer.ReplaceText,{"Столбец1"}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Замененное значение", "SplitList", each Text.SplitAny([Столбец1],",")),
    #"Дублированный столбец" = Table.DuplicateColumn(#"Добавлен пользовательский объект", "SplitList", "Val"),
    #"Развернутый элемент Val" = Table.ExpandListColumn(#"Дублированный столбец", "Val"),
    #"Add ListsS" = Table.AddColumn(#"Развернутый элемент Val", "Lists", each List.Accumulate(List.Numbers(0, List.Count(#"Дублированный столбец"[SplitList])),{[Val]}, (x,y)=> if List.Count(List.Intersect({#"Дублированный столбец"[SplitList]{y},x}))>0 then List.Union({#"Дублированный столбец"[SplitList]{y},x}) else x)),
    #"Удаленные дубликаты" = Table.Distinct(#"Add ListsS", {"Lists"}),
    #"Добавлен пользовательский объект1" = Table.AddColumn(#"Удаленные дубликаты", "Res", each Text.Combine(List.Sort([Lists]), ", ")),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Добавлен пользовательский объект1",{"Res"})
in
    #"Другие удаленные столбцы"
 
AlienSx, благодарю! Интересное решение, буду изучать. Всегда интересны альтернативные решения!
 
AlienSx, у вас на 14 значениях что-то неверно считает)
Елена Ярыгина, ваш запрос на увеличенном списке тоже неправильно
мой вариант:
Код
let
    lst = Excel.CurrentWorkbook(){[Name="lst"]}[Content][Column1],
    fr = List.Transform(lst, (x)=>Text.Split(x, ",")),
    f1=(x) => [ z1 = List.Distinct(List.Transform(x, (x)=>List.Union(List.Select(fr, (y)=>List.ContainsAny(y,x))))),
                z2 =  if x=z1 then x else @f1(z1)][z2],
    b1 = List.Buffer(f1(fr)),
    to = Table.FromList(b1, (x)=>{Text.Combine(x, ",")})
in
    to
Изменено: Garrys - 28.03.2024 13:04:55
 
Цитата
Garrys написал:
у вас на 14 значениях что-то неверно считает)
да не. Если б работало, то никакие 14 значений не страшны. Что-то пошло не так :) Удалил к чертям собачим. Вложенные рекурсии отказались дружить :)
Пришелец-прораб.
 
Garrys, о, да! Нижайший поклон! Очень помогли! И работает быстро!!!
 
А нет, поторопилась... вот на такой выборке
А
Б
В, Г
Г, Д
В, Е
Б, Ж
З
И
Получается результат
А
Б, Ж
В, Г, Е
Г, Д
З
И
т.е. "В, Г, Е" и "Г, Д" должны были объединиться по общей Г... :oops:  
 
не знаю, у меня работает
 
Добавила в разделитель в сплите пробел и тоже заработало.
= List.Transform(lst, (x)=>Text.Split(x, ", "))
Спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Страницы: 1
Наверх