Пишем эффективно — 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