Получаем код всех запросов из всех файлов из папки

#АнатомияФункций – 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