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