Пишем эффективно — Combine + Expand против FromRecords
#АнатомияФункций – Table.FromRecords
Всем привет!
В чат подкинули задачку. По этому поводу наиболее простым и логичным («красивым») показался такой код:
let
f=(x)=>Function.Invoke(Record.FromList,List.Reverse(List.Zip(List.Split(List.RemoveNulls(x),2)))),
from = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name="TData"]}[Content]),
nms = List.Select(Table.ColumnNames(from),(x)=>Text.Contains(x,"DL")),
cmb = Table.Buffer(Table.CombineColumns(from,nms,f,"tmp")),
newnms = List.Distinct(List.Combine(List.Transform(cmb[tmp],Record.FieldNames))),
to = Table.ExpandRecordColumn(cmb,"tmp",newnms)
in
to
Вроде всё логично… просто зачем два табличных преобразования, когда можно на списках? Риторический вопрос )))
let
f=(x)=>[a=List.Zip(List.Split(List.RemoveNulls(List.Skip(x,pos)),2)),
b=Record.FromList(List.FirstN(x,pos)&a{1},fnms&a{0})][b],
from = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name="TData"]}[Content]),
nms = Table.ColumnNames(from),
pos = List.PositionOf(nms,"DL",Occurrence.First,Text.Contains),
fnms = List.Buffer(List.FirstN(nms,pos)),
lst = List.Buffer(Table.ToList(from,f)),
newnms = List.Distinct(List.Combine(List.Transform(lst,Record.FieldNames))),
to = Table.FromRecords(lst,newnms,MissingField.UseNull)
in
to
Вроде сложнее, но реально быстрее.
А как так и почему смотрим
На
рутубе дзене ютубе
Исходники уже лежат
на спонсоре
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik