fxGetMCode – получаем код М, используя М
#АнатомияФункций – buchOfficePack
Всем привет!
Дошли руки до вынимания кода запросов из файлов. В целом, после fxUnZip это уже не должно быть особо сложным. Просто надо ещё немножко почитать спецификацию.
А там, как всегда, всё написано и по этому поводу функция (она является частью библиотеки, поэтому убедитесь, что fxUnZip у вас имеется в наличии):
По шагам
u32 – вспомогательная функция для чтения 4-байтного беззнакового целого (размер массива)
f – ещё одна вспомогательная – отрезает название запроса от собственно кода запроса
А теперь основное тело
from – открываем файл как архив и вынимаем customXml/item1.xml – код хранится там
bin – внутри этого xml лежит в виде текста сжатый бинарник (DataMashup) – возвращаем ему первозданный бинарный вид
data – из полученного бинарника пропускаем первые 4 байта, а вторые 4 указывают на размер массива, содержащего код - читаем
unz – и поскольку этот массив ещё и сжатый – снова используем fxUnZip и вынимаем Formulas/Section1.m – файл с кодом
txt – превращаем бинарку в текст и дописываем в конце перевод каретки с разрывом строки (там просто запросы отделены точкой с запятой с последующим переводом каретки, но в самом конце идёт просто точка с запятой – короче добиваемся единообразия)
splt – теперь делим общий текст на отдельные запросы
lst – отбрасываем лишние первый и последний фрагменты
tbl – собираем в табличку, параллельно отделяя название запроса от его кода
to – ну и на выход подаём либо табличку, либо пустую табличку, когда запросов в файле не оказалось.
Как обычно, код короче своего описания ))) Видос с более подробным разбором будет, но уже в новом году. Пользуйтесь!
Надеюсь, было полезно.
Всех благ!
@buchlotnik
#АнатомияФункций – buchOfficePack
Всем привет!
Дошли руки до вынимания кода запросов из файлов. В целом, после fxUnZip это уже не должно быть особо сложным. Просто надо ещё немножко почитать спецификацию.
А там, как всегда, всё написано и по этому поводу функция (она является частью библиотеки, поэтому убедитесь, что fxUnZip у вас имеется в наличии):
fxGetMCode=(file)=>
[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],
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],
txt = Text.FromBinary(unz)&"#(cr,lf)",
splt = Text.Split(txt,";#(cr,lf)"),
lst = List.Range(splt,1,List.Count(splt)-2),
tbl = Table.FromList(lst,f,{"Name","Value"}),
to = if from=null then #table({"Name","Value"},{{null,null}}) else tbl][to]
По шагам
u32 – вспомогательная функция для чтения 4-байтного беззнакового целого (размер массива)
f – ещё одна вспомогательная – отрезает название запроса от собственно кода запроса
А теперь основное тело
from – открываем файл как архив и вынимаем customXml/item1.xml – код хранится там
bin – внутри этого xml лежит в виде текста сжатый бинарник (DataMashup) – возвращаем ему первозданный бинарный вид
data – из полученного бинарника пропускаем первые 4 байта, а вторые 4 указывают на размер массива, содержащего код - читаем
unz – и поскольку этот массив ещё и сжатый – снова используем fxUnZip и вынимаем Formulas/Section1.m – файл с кодом
txt – превращаем бинарку в текст и дописываем в конце перевод каретки с разрывом строки (там просто запросы отделены точкой с запятой с последующим переводом каретки, но в самом конце идёт просто точка с запятой – короче добиваемся единообразия)
splt – теперь делим общий текст на отдельные запросы
lst – отбрасываем лишние первый и последний фрагменты
tbl – собираем в табличку, параллельно отделяя название запроса от его кода
to – ну и на выход подаём либо табличку, либо пустую табличку, когда запросов в файле не оказалось.
Как обычно, код короче своего описания ))) Видос с более подробным разбором будет, но уже в новом году. Пользуйтесь!
Надеюсь, было полезно.
Всех благ!
@buchlotnik