Раскидываем иерархию без генератора и СМС

#АнатомияФункций – Table.CombineColumns, Table.SplitColumn





Всем привет!

Когда-то писал про раскидывание иерархии через List.Generate

Включил разбор этой функции в свой курс…

Обратная связь примерно такая: Гену никто не любит.

Это, конечно, печаль – он мастер на все руки, просто натура сложная, требует особого подхода… а это никому не интересно – всем нужен результат, причём вчера.



Ну что ж, раз такое дело, напишем код без Гены:

let

f=(x)=>((y)=>List.Repeat({null},y)&List.Repeat({x{1}},max-y))(x{0}-1),



from = Excel.CurrentWorkbook(){[Name="Иерархия2"]}[Content],

nm = List.Buffer(Table.ColumnNames(from)),

lvl = List.Buffer(Table.Column(from,nm{0})),

lst = List.Buffer(List.Transform(List.Zip({lvl,List.Skip(lvl)&{0}}),(x)=>x{1}<=x{0})),

max = List.Max(lvl),

nms = List.Transform({1..max},(x)=>nm{0}&Text.From(x)),

cmb = Table.CombineColumns(from,List.FirstN(nm,2),f,"tmp"),

splt = Table.SplitColumn(cmb,"tmp",(x)=>x,nms),

fill = Table.FillDown(splt,nms),

add = Table.AddIndexColumn(fill,"i"),

tr = Table.TransformColumns(add,{"i",(x)=>lst{x}}),

slct = Table.SelectRows(tr,(x)=>x[i]),

to = Table.RemoveColumns(slct,{"i"})

in

to


По скорости оно не хуже, а в прыжке даже лучше.



Детали можно посмотреть на рутубе

или дзене



Ну а с исходниками всё давно лежит на sponsr.ru



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



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

Всех благ!

@buchlotnik