#АнатомияФункций – 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