Так ли плох 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