Иерархия или дерево категорий
#АнатомияФункций – complex
Всем привет!
Ковыряли уже иерархию, рекурсивно находили уровни вложенных подпунктов, но вот так, чтобы словарь, рекурсия, группировка, джоин и аккумулятор в одном флаконе – как-то не припомню…
По этому поводу код (сильно не бить, он, конечно, не пятничный, но воскресный):
Ну а что тут к чему рассказываю:
На рутубе
А с исходниками всё давно лежит на Sponsr.Ru
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik
#АнатомияФункций – 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