Привет Всем! У меня на листе есть коды продуктов, и каждому продукту на сети (в разной глубине подпапок) лежат по несколько картинок (в формате pdf, jpg, png). Наименование картинок не очень хорошее . Мне необходимо получить напротив кода путь к одной из его картинок. (любой) Благодаря данному форуму я собрал запрос и он работает, но очень долго обновляется Подскажите пожалуйста, его возможно оптимизировать? И если да, то как? Возможно, кто-то даст советы по оптимизации на будущее?
Код
let
BOM = Excel.CurrentWorkbook(){[Name="BOM"]}[Content],
BOM.УдалитьСтолбцы = Table.SelectColumns(BOM,{"3", "4", "11", "12", "22"}),
BOM.Фильтр = Table.SelectRows(BOM.УдалитьСтолбцы, each ([3] = 71398)),
BOM.ИзмененТип = Table.TransformColumnTypes(BOM.Фильтр,{{"11", type text}}),
BOM.Переименовать = Table.RenameColumns(BOM.ИзмененТип,{{"3", "SKU"}, {"4", "Наименование SKU"}, {"11", "Код материала"}, {"12", "Наименование материала"}, {"22", "Комментарии к изменениям"}}),
Materials = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{0}[Path]),
Materials.Фильтр = Table.SelectRows(Materials, each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials.Фильтр2 = Table.SelectRows(Materials.Фильтр, each not Text.Contains([Extension], "~$")),
Materials.Путь = Table.AddColumn(Materials.Фильтр2, "Ссылка на дизайн", each [Folder Path]&[Name]),
Materials.УдалитьСтолбцы = Table.SelectColumns(Materials.Путь,{"Name", "Ссылка на дизайн"}),
Materials.Join = Table.Join(BOM.Переименовать,{},Materials.УдалитьСтолбцы,{}),
Materials.Merge = Table.SelectRows(Materials.Join, each Text.Contains([Name],[Код материала]))&Materials.УдалитьСтолбцы,
Materials.Filtr = Table.SelectRows(Materials.Merge, each [Код материала] <> null),
Materials.Dubl = Table.Distinct(Materials.Filtr, {"Код материала"}),
Materials2 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{1}[Path]),
Materials2.Фильтр = Table.SelectRows(Materials2, each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials2.Фильтр2 = Table.SelectRows(Materials2.Фильтр, each not Text.Contains([Extension], "~$")),
Materials2.Путь = Table.AddColumn(Materials2.Фильтр2, "Ссылка на дизайн", each [Folder Path]&[Name]),
Materials2.УдалитьСтолбцы = Table.SelectColumns(Materials2.Путь,{"Name", "Ссылка на дизайн"}),
Materials2.Join = Table.Join(BOM.Переименовать,{},Materials2.УдалитьСтолбцы,{}),
Materials2.Merge = Table.SelectRows(Materials2.Join, each Text.Contains([Name],[Код материала]))&Materials2.УдалитьСтолбцы,
Materials2.Filtr = Table.SelectRows(Materials2.Merge, each [Код материала] <> null),
Materials2.Dubl = Table.Distinct(Materials2.Filtr, {"Код материала"}),
Materials3 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{2}[Path]),
Materials3.Фильтр = Table.SelectRows(Materials3, each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials3.Фильтр2 = Table.SelectRows(Materials3.Фильтр, each not Text.Contains([Extension], "~$")),
Materials3.Путь = Table.AddColumn(Materials3.Фильтр2, "Ссылка на дизайн", each [Folder Path]&[Name]),
Materials3.УдалитьСтолбцы = Table.SelectColumns(Materials3.Путь,{"Name", "Ссылка на дизайн"}),
Materials3.Join = Table.Join(BOM.Переименовать,{},Materials3.УдалитьСтолбцы,{}),
Materials3.Merge = Table.SelectRows(Materials3.Join, each Text.Contains([Name],[Код материала]))&Materials3.УдалитьСтолбцы,
Materials3.Filtr = Table.SelectRows(Materials3.Merge, each [Код материала] <> null),
Materials3.Dubl = Table.Distinct(Materials3.Filtr, {"Код материала"}),
Materials4 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{3}[Path]),
Materials4.Фильтр = Table.SelectRows(Materials4, each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials4.Фильтр2 = Table.SelectRows(Materials4.Фильтр, each not Text.Contains([Extension], "~$")),
Materials4.Путь = Table.AddColumn(Materials4.Фильтр2, "Ссылка на дизайн", each [Folder Path]&[Name]),
Materials4.УдалитьСтолбцы = Table.SelectColumns(Materials4.Путь,{"Name", "Ссылка на дизайн"}),
Materials4.Join = Table.Join(BOM.Переименовать,{},Materials4.УдалитьСтолбцы,{}),
Materials4.Merge = Table.SelectRows(Materials4.Join, each Text.Contains([Name],[Код материала]))&Materials4.УдалитьСтолбцы,
Materials4.Filtr = Table.SelectRows(Materials4.Merge, each [Код материала] <> null),
Materials4.Dubl = Table.Distinct(Materials4.Filtr, {"Код материала"}),
Materials5 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{4}[Path]),
Materials5.Фильтр = Table.SelectRows(Materials5, each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials5.Фильтр2 = Table.SelectRows(Materials5.Фильтр, each not Text.Contains([Extension], "~$")),
Materials5.Путь = Table.AddColumn(Materials5.Фильтр2, "Ссылка на дизайн", each [Folder Path]&[Name]),
Materials5.УдалитьСтолбцы = Table.SelectColumns(Materials5.Путь,{"Name", "Ссылка на дизайн"}),
Materials5.Join = Table.Join(BOM.Переименовать,{},Materials5.УдалитьСтолбцы,{}),
Materials5.Merge = Table.SelectRows(Materials5.Join, each Text.Contains([Name],[Код материала]))&Materials5.УдалитьСтолбцы,
Materials5.Filtr = Table.SelectRows(Materials5.Merge, each [Код материала] <> null),
Materials5.Dubl = Table.Distinct(Materials5.Filtr, {"Код материала"}),
Materials.Combine = Table.Combine({Materials.Dubl, Materials2.Dubl, Materials3.Dubl, Materials4.Dubl, Materials5.Dubl}),
Materials.Combine2 = Table.Combine({Materials.Combine, BOM.Переименовать}),
Materials.Duble= Table.Distinct(Materials.Combine2, {"Код материала"})
in
Materials.Duble
Во первых, если не нужно содержимое подпапок, то можно использовать Foder.Contents вместо Folder.Files. Это уже будет супер ускорение. Если же все таки содержимое подпапок требуется, то я бы сначала объединил в одну таблицу все обращения к папкам, а уже после этого крутил бы фильтры, джойны и вот это вот все.
Пробуйте. Можно регулярками, можно другими способами, тут главное увидеть все возможные наименования файлов, чтобы понимать как очищать их от "мусора" чтобы выделить код.
let fx=(txt as text, regex as text, delim as text)=>
Web.Page(
"<script>
var x = '" & txt & "';
var delim = '" & delim & "';
var pattern = /" & regex & "/gi;
var result = x.match(pattern).join(delim);
document.write(result);
</script>")[Data]{0}[Children]{0}[Children]{1}[Text]{0}
in
fx
Код
let
Materials = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{0}[Path]),
Materials2 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{1}[Path]),
Materials3 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{2}[Path]),
Materials4 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{3}[Path]),
Materials5 = Folder.Files(Excel.CurrentWorkbook(){[Name="tPath2"]}[Content]{4}[Path]),
Materials.Combine = Table.Buffer(Table.Combine({Materials, Materials2, Materials3, Materials4, Materials5})),
#"Сохраненные первые строки" = Table.FirstN(Materials.Combine,5),
Materials.Фильтр = Table.SelectRows(#"Сохраненные первые строки", each Text.Contains([Extension], ".pdf") or Text.Contains([Extension], ".jpg") or Text.Contains([Extension], ".jpeg") or Text.Contains([Extension], ".png")),
Materials.Фильтр2 = Table.SelectRows(Materials.Фильтр, each not Text.Contains([Extension], "~$")),
Materials.Регулярка = Table.AddColumn(Materials.Фильтр2, "fxRegExpExtract", each fxRegExpExtract([Name], "(\d{7,8})", ";")),
#"Измененный тип" = Table.TransformColumnTypes(Materials.Регулярка,{{"fxRegExpExtract", Int64.Type}}),
Materials.Путь = Table.AddColumn(Materials.Регулярка, "Путь", each [Folder Path]&[Name])
in
Materials.Путь