Страницы: 1
RSS
Использование текстового значения в ячейке как имени функции/преобразование текстового значения в функцию
 
Уважаемые форумчане, добрый день! Вопрос следующий:
В power query создано три функций "1", "2", "3"  , каждая из которых преобразует файлы эксель трех видов "А", "В", "С" в единую форму документа "D" .

Далее запрос  "Тест" к папке, которая содержит три подпапки "1", "2", "3" (аналогично названиям функций). Могу ли я, применить функции "1", "2", "3" в запросе  "Тест", используя в качестве названия функции часть текста "Folder Path"?  Я в итоге обошел проблему, сделав промежуточные запросы к папкам "1", "2", "3" и объединив их в один стандартными средствами PQ, но первое (незаконченное) решение показалось мне более удобным, а в синтаксисе m языка не сумел подобрать подходящую функцию. Подскажите пожалуйста, можно как-то обойти эту ошибку? Скрины приложил.
Спасибо!

Изменено: drakovskiy78 - 17.01.2020 14:58:47
 
для трех функций можно так попробовать
Код
let
   #"1" = (text) => let
        a = Number.From(text)*1
    in
        a,
   #"2" = (text) => let
        a = Number.From(text)*2
    in
        a,
   #"3" = (text) => let
        a = Number.From(text)*3
    in
        a,

    Source = Folder.Files("C:\Users\Администратор\Desktop\Тест"),
    #"Added Custom" = Table.AddColumn(Source, "Пользовательская", each Lines.FromBinary([Content], null, null, 1251)),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"Пользовательская", each Text.Combine(List.Transform(_, Text.From)), type text}),
    #"Inserted Text Between Delimiters" = Table.AddColumn(#"Extracted Values", "Текст между разделителями", each  Text.BetweenDelimiters([Folder Path], "\", "\", {1, RelativePosition.FromEnd}, 0) , type text),
    #"Invoked Custom Function" = Table.AddColumn(#"Inserted Text Between Delimiters", "Пользовательская.1", each if [Текст между разделителями] = "1" then #"1"([Пользовательская]) else if [Текст между разделителями] = "2" then #"2"([Пользовательская]) else  #"3"([Пользовательская]))
in
    #"Invoked Custom Function"
Изменено: artyrH - 17.01.2020 18:50:14
 
Доброе время суток
Цитата
artyrH написал:
для трех функций можно так попробовать
Артур, в вашем решении всё же статически задаётся использование функций. Можно чуть по другому. Но функции должны быть определены вне запроса.
Updated
Для функций, определённых внутри запроса, можно пойти таким путём
Код
let
    functionRec = [
        _f1 = (item) => item & " number one",
        _f2 = (item) => item & " number two"
    ],
    Source = #table(type table [functionName = Text.Type, functionArg = Text.Type], {
        {"_f1", "arg one"},
        {"_f2", "arg two"}
    }),
    result = Table.AddColumn(Source, "Call Result", each Function.Invoke(Record.Field(functionRec, [functionName]), {[functionArg]}))
in
    result
Изменено: Андрей VG - 18.01.2020 10:20:05
 
Цитата
Андрей VG написал:
статически задаётся
так я час пытался сделать из текста функцию. типа
Код
= Table.AddColumn(Insert, "b",  each "#"""&[Текст между разделителями]&""""([a]))

но, как часто со мной бывает, не хватило знаний :)  а потом, чтоб хоть что то сделать, слепил на Если.
теперь, благодаря вашему решению, все собрано как требовалось  
 
Благодарю за помощь!
Буду разбираться
Страницы: 1
Наверх