View in Telegram
Так ли плох FillDown? #Анатомия Функций – Table.FillDown, List.Generate Всем привет! Прилетела в чат задачка на «FillDown не до конца» (т.е. протяжка вниз, но с доп. Условиями). Понятно, что это решается через генератор:
let
    from = Excel.CurrentWorkbook(){[Name="ЕСТЬ"]}[Content],
    lst = List.Buffer(Table.ToList(from,(x)=>x)),
    n=List.Count(lst),
    gen = List.Generate(()=>[i=0,j=lst{i},k=0,l=j],
                        (x)=>x[i]<n,
                        (x)=>[i=x[i]+1,j=lst{i},
                                k=List.PositionOf(j,null,Occurrence.First,(c,v)=>c<>v),
                                l=List.FirstN(x[l],k)&List.Skip(j,k)],
                        (x)=>x[l]),
    to = Table.FromList(gen,(x)=>x,Value.Type(from))
in
to
А ещё этот генератор можно подускорить и с оптимизировать под большой объем:
let
    
    f=(x)=>
    [lst = List.Buffer(Table.ToList(x,(x)=>x)),
    n=List.Count(lst),
    gen = List.Generate(()=>[i=0,k=0,l=lst{i}],
                        (x)=>x[i]<n,
                        (x)=>[i=x[i]+1,
                                k=List.PositionOf(lst{i},null,Occurrence.First,(c,v)=>c<>v),
                                l=List.ReplaceRange(lst{i},0,k,List.FirstN(x[l],k))],
                        (x)=>x[l])][gen],
    from = Excel.CurrentWorkbook(){[Name="ЕСТЬ"]}[Content],
    gr = Table.Group(from,"Path 1",{"tmp",f},GroupKind.Local,(s,c)=>Number.From(c<>null)),                    
    to = Table.FromList(List.Combine(gr[tmp]),(x)=>x,Value.Type(from))
in
    to
А ещё… можно использовать FillDown, просто в связке с Zip:
let
    f=(x)=>Table.ToList(x,(x)=>x),
    g=(x)=>[a=List.PositionOf(x{0},null,Occurrence.First,(c,v)=>c<>v),
            b=List.ReplaceRange(x{0},0,a,List.FirstN(x{1},a))][b],
    h=(x)=>List.Zip({f(x),f(Table.FillDown(x,nms))}),
    
    from = Excel.CurrentWorkbook(){[Name="ЕСТЬ"]}[Content],
    nms = List.RemoveLastN(Table.ColumnNames(from),3),
    gr = Table.Group(from,"Path 1",{"tmp",h},GroupKind.Local,(s,c)=>Number.From(c<>null)),
    to = Table.FromList(List.Combine(gr[tmp]),g,Value.Type(from))
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