View in Telegram
Пишем эффективно — 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
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Find friends or serious relationships easily