let
f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content],
g=(x)=>List.Accumulate(dict,x,h),
h=(x,y)=>Text.Replace(x,y[Найти],y[Заменить]),
k=(x,y)=>Table.TransformColumns(x,{y,g}),
from = f("Данные"),
dict = List.Buffer(Table.ToRecords(f("Справочник"))),
to = List.Accumulate(Table.ColumnNames(from),from,k)
in
to
по скорости те же яйца, только в профиль в файле результаты обработки 640k строк
DNC написал: List.Accumulate нужно вложить в Table.TransformColumns,
видимо как-то так...
Код
let
f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content],
g=(x)=>List.Accumulate(dict,x,h),
h=(x,y)=>Text.Replace(x,y{0},y{1}),
k=(x,y)=>Table.TransformColumns(x,{y,g}),
from = f("Данные"),
dict = List.Buffer([a=f("Справочник"),b=List.Zip({a[Найти],a[Заменить]})][b]),
to = List.Accumulate(Table.ColumnNames(from),from,k)
in
to
Настя_Nastya написал: Мне нужно найти предыдущую дату продажи продукта для последующих вычислений.
вы и правда считаете рациональным приматывать неформульные инструменты к части вычислений. может все-таки покажете задачу в терминах "исходные данные - ожидаемый конечный результат"?
let
l = {"0".."9"},
t = {"инт", "ук", "штк", "сит", "отт"},
f = Splitter.SplitTextByCharacterTransition(l,(x)=> not List.Contains(l,x)),
g=(x)=>[a=f(x), b = if List.Count(a) = 1 then {1}&a else a][b],
h=(x)=> List.Accumulate(List.Transform(Text.Split(x,"+"),g),[],(s,c)=>Record.AddField(s,c{1},c{0})),
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
trnsf = Table.AddColumn(from,"t",each h([Выгрузка с базы])),
to = Table.ExpandRecordColumn(trnsf, "t",t)
in
to
Татьяна написал: все формулы по функции ДАТА использовала
формулы не помогут - нужен макрос
Цитата
Татьяна написал: когда эксперт заполняет ячейки с синим цветом с данными, в ячейке рядом с словом дата должна появляться автоматически дата на день заполнения данной таблицы
в какой момент времени - при заполнении первой цветной из группы или когда заполнены все голубые?
let
l = {"0".."9"},
t = {"инт", "ук", "штк", "сит", "отт"},
f=(x)=>[a=Text.PositionOfAny(x,l,Occurrence.Last),
b = if a = -1
then {1,x}
else {Number.From(Text.Range(x,0,a+1)),Text.Range(x,a+1)}
][b],
g=(x)=> List.Accumulate(List.Transform(Text.Split(x,"+"),f),
[],
(s,c)=>Record.AddField(s,c{1},c{0})
),
from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
add = Table.AddColumn(from,"t",each g([Выгрузка с базы])),
to = Table.ExpandRecordColumn(add, "t",t)
in
to
PooHkrd, приветствую. Странно, не замечал проблем ранее, но если возникнет проблема - по крайней мере буду знать потенциальный источник багов, спасибо.
а кто-то с этим спорит? только "простой" вариант на сотню позиций написать уже не так просто и тем более его администрировать, если словарь меняется; а так есть вариант чуть пошустрее:
Код
let
f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content],
g=(x,y)=>Text.Contains(y,x),
h=(x)=>lst1{List.PositionOf(lst0,x,Occurrence.First,g)},
dict = f("Таблица3"),
lst0 = List.Buffer(dict[Город]),
lst1 = List.Buffer(dict[Направление]),
to = Table.AddColumn(f("Таблица2"),"Направление",each h([Маршрут строка]))
in
to
let
f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content], //вспомогательная функция для подключения к таблицам текущей книги
g=(x,y)=>List.First(//в итоге будем брать первый элемент из совпавших
List.Accumulate(y,//аккумулируем список из аргумента y - вданном случае сюда передается преобразованный словарь из lst
{},//за опорное значение принимаем пустой список
(s,c)=>if Text.Contains(x,c{0}) //если текст из аргумента x содержит город из пары "город-направление"
then s&{c{1}} //добавить к списку это направление
else s)//иначе ниего не добавлять
),
dict = f("Таблица3"),//подключаемся к словарю
lst = List.Buffer(List.Zip({dict[Город],dict[Направление]})),//превращаем таблицу словаря в список - пары город-направление
to = Table.AddColumn(f("Таблица2"), //подключаемся к основной таблице
"Направление",//добавляем столбец "Направление"
each g([Маршрут строка],lst))//значение которого - функция g от столбца "Маршрут строка"
in
to //усё
Andrey_S написал: Добавил три справочника, и решаю через три условных столбца
избыточно, на мой вкус
Код
let
f=(x)=>Excel.CurrentWorkbook(){[Name=x]}[Content],
g=(x,y)=>List.First(List.Accumulate(y,{},(s,c)=>if Text.Contains(x,c{0}) then s&{c{1}} else s)),
dict = f("Таблица3"),
lst = List.Buffer(List.Zip({dict[Город],dict[Направление]})),
to = Table.AddColumn(f("Таблица2"),"Направление",each g([Маршрут строка],lst))
in
to
let
from = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name="TData"]}[Content]),
lst = List.Skip(Table.ColumnNames(from),2),
tbl=Table.CombineColumns(from,lst,(x)=>List.Accumulate(List.Split(x,3),{},(s,c)=>s&{[Участник=c{0},ИНН=c{1},Предложение=c{2}]}),"tmp"),
exp = Table.ExpandListColumn(tbl, "tmp"),
exp1 = Table.ExpandRecordColumn(exp, "tmp", {"Участник", "ИНН", "Предложение"}),
to = Table.SelectRows(exp1, each ([ИНН] <> null))
in
to
с рюшками
Код
let
f=(x,y)=>x&{[Участник=y{0},ИНН=y{1},Предложение=y{2}]},
g=(x)=>List.Accumulate(List.Split(x,3),{},f),
from = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name="TData"]}[Content]),
lst = List.Skip(Table.ColumnNames(from),2),
tbl=Table.CombineColumns(from,lst,g,"tmp"),
exp = Table.ExpandListColumn(tbl, "tmp"),
exp1 = Table.ExpandRecordColumn(exp, "tmp", {"Участник", "ИНН", "Предложение"}),
to = Table.SelectRows(exp1, each ([ИНН] <> null))
in
to
ну и функцией
Код
//fnCombineTable
(tbl,n,l)=>
let
e=(x,y)=>Record.AddField(x,y{0},y{1}),
f=(x)=>List.Accumulate(List.Zip({l,x}),[],e),
g=(x,y)=>x&{f(y)},
h=(x)=>List.Accumulate(List.Split(x,m),{},g),
m = List.Count(l),
t = l{0},
lst = List.Skip(Table.ColumnNames(tbl),n),
tb = Table.CombineColumns(tbl,lst,h,"t"),
exp = Table.ExpandListColumn(tb, "t"),
exp1 = Table.ExpandRecordColumn(exp, "t", l),
to = Table.SelectRows(exp1, each (Record.Field(_,t) <> null))
in
to
//использование:
let
from = Table.PromoteHeaders(Excel.CurrentWorkbook(){[Name="TData"]}[Content]),
to = fnCombineTable(from,2,{"Участник", "ИНН", "Предложение"})
in
to
делаем видимым всё скрытое и удаляем нахрен совет на будущее - скрывайте всё лишнее в самом конце, когда уверены, что файл точно пашет; чтобы не было таких нежданчиков с протяжкой формул/форматов