Получаем код всех запросов из всех файлов из папки
#АнатомияФункций – custom
Всем привет!
На текущий момент на канале есть fxUnzip, есть fxGetMCode и есть пост про Folder.Files.
Мне казалось, что этого достаточно, чтобы самостоятельно собрать адекватное подключение к папке и получить код запросов из всех файлов внутри неё. Но оказалось, что я просто пишу нерабочий код и всё вышеизложенное «не взлетает». ОК, напишем код целиком:
где
func – собственно функция для вынимания кода запросов (fxUnzip интегрирована внутрь «во избежание»)
from – подключение к папке (увы, я заранее не знаю путь к конкретной папке – его придётся исправить на свой, ручками – если даже это станет проблемой – мои полномочия всё)
filtr, rem – оставили только эксельки и только нужные столбцы
tr,to – преобразовали бинарки файлов в таблицы и развернули их
И всё. Кто найдёт в коде выше File.Contents, без которой якобы не работает – пусть первым бросит в меня камень. Большая просьба думать перед тем, как писать, что что-то «не работает».
Надеюсь, было полезно.
Всех благ!
@buchlotnik
#АнатомияФункций – custom
Всем привет!
На текущий момент на канале есть fxUnzip, есть fxGetMCode и есть пост про Folder.Files.
Мне казалось, что этого достаточно, чтобы самостоятельно собрать адекватное подключение к папке и получить код запросов из всех файлов внутри неё. Но оказалось, что я просто пишу нерабочий код и всё вышеизложенное «не взлетает». ОК, напишем код целиком:
let
lst={"QueryName","Value"},
//функция
func=(file)=>[
u16 =BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16,ByteOrder.LittleEndian),
u32 =BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32,ByteOrder.LittleEndian),
f=(x)=>[a=Text.Split(x," = "),b={Text.Trim(Text.Replace(a{0},"shared","")),Text.Combine(List.Skip(a)," = ")}][b],
fxUnzip=(ZIP)=>
[ get=(x)=>BinaryFormat.Record(if Binary.Range(x,0,4)=#binary({0x50,0x4b,0x03,0x04})
then [ Name=BinaryFormat.Text(u16(Binary.Range(x,26,2))),
Extr=BinaryFormat.Binary(u16(Binary.Range(x,28,2))),
Value=BinaryFormat.Transform(BinaryFormat.Binary(u32(Binary.Range(x,18,4))),(y)=>Binary.Decompress(y,Compression.Deflate))]
else []),
lst = BinaryFormat.List(BinaryFormat.Choice(BinaryFormat.Binary(30),get),(x)=>x<>[])(ZIP),
to = Table.FromRecords(List.RemoveLastN(lst,1),type table [Name=text,Value=binary])][to],
from = fxUnzip(file){[Name="customXml/item1.xml"]}?[Value]?,
bin = Binary.FromText(Xml.Document(from){0}[Value],BinaryEncoding.Base64),
data = BinaryFormat.Choice(BinaryFormat.Binary(8),(x)=>BinaryFormat.Binary(u32(Binary.Range(x,4,4))))(bin),
unz = fxUnzip(data){[Name="Formulas/Section1.m"]}[Value],
splt = Text.Split(Text.FromBinary(unz)&"#(cr,lf)",";#(cr,lf)"),
tbl = Table.FromList(List.Range(splt,1,List.Count(splt)-2),f,lst),
to = if from=null then #table(lst,{{null,null}}) else tbl][to],
//собственно подключение к папке
from = Folder.Files("ПУТЬ К ПАПКЕ ВВЕСТИ САМОСТОЯТЕЛЬНО"),
filtr = Table.SelectRows(from, (r)=> (r[Extension] = ".xlsm" or r[Extension] = ".xlsx")),
rem = Table.SelectColumns(filtr,{"Name", "Content"}),
tr = Table.TransformColumns(rem,{"Content",func}),
to = Table.ExpandTableColumn(tr,"Content",lst)
in
to
где
func – собственно функция для вынимания кода запросов (fxUnzip интегрирована внутрь «во избежание»)
from – подключение к папке (увы, я заранее не знаю путь к конкретной папке – его придётся исправить на свой, ручками – если даже это станет проблемой – мои полномочия всё)
filtr, rem – оставили только эксельки и только нужные столбцы
tr,to – преобразовали бинарки файлов в таблицы и развернули их
И всё. Кто найдёт в коде выше File.Contents, без которой якобы не работает – пусть первым бросит в меня камень. Большая просьба думать перед тем, как писать, что что-то «не работает».
Надеюсь, было полезно.
Всех благ!
@buchlotnik