Иерархия или дерево категорий

#АнатомияФункций – complex



Всем привет!



Ковыряли уже иерархию, рекурсивно находили уровни вложенных подпунктов, но вот так, чтобы словарь, рекурсия, группировка, джоин и аккумулятор в одном флаконе – как-то не припомню…



По этому поводу код (сильно не бить, он, конечно, не пятничный, но воскресный):

let

f=(x,y)=>((a)=>if a=null then Text.From(y) else @f(a,y+1))(Record.Field(dict,x)),

g=(x)=>{"lvl"&x{0}&".parent_id","lvl"&Text.From(Number.From(x{0})-1)&".cat_id",Table.PrefixColumns(x{1},"lvl"&x{0})},

h=(x,y)=>Table.Join(x,y{1},y{2},y{0},JoinKind.LeftOuter),



adres = Excel.CurrentWorkbook(){[Name="adres"]}[Content]{0}[Column1],

from = Table.PromoteHeaders(Csv.Document(File.Contents(adres),3)),

tr = Table.TransformColumns(from,{"parent_id",(x)=>Text.Split(x,"."){0}}),

dict = Record.FromList(tr[parent_id],tr[cat_id])&[#""=null],

add = Table.AddColumn(tr,"lvl",(x)=>f(x[parent_id],1)),

gr = Table.Group(add,"lvl",{"tmp",(x)=>Table.RemoveColumns(x,"lvl")}),

lst = Table.ToList(gr,g),

acc = List.Accumulate(List.Skip(lst),lst{0}{2},h),

nms = List.Alternate(Table.ColumnNames(acc),1,2,1),

to = Table.SelectColumns(acc,nms)

in

to




Ну а что тут к чему рассказываю:

На рутубе

А с исходниками всё давно лежит на Sponsr.Ru



Лайк, коммент, подписка приветствуются )))



Надеюсь, было полезно.

Всех благ!

@buchlotnik