Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
PQ. Замена значений по нескольким условиям
 
Добрый день!

Сейчас:
Код
 #"Убрать """ = Table.ReplaceValue(#"Убрать !","""","",Replacer.ReplaceText,{"Арт"}),
    #"Убрать '" = Table.ReplaceValue(#"Убрать ""","'","",Replacer.ReplaceText,{"Арт"}),
    #"Убрать @" = Table.ReplaceValue(#"Убрать '","@","",Replacer.ReplaceText,{"Арт"}),
    #"Убрать #" = Table.ReplaceValue(#"Убрать @","#","",Replacer.ReplaceText,{"Арт"}),
    #"Убрать №" = Table.ReplaceValue(#"Убрать #","№","",Replacer.ReplaceText,{"Арт"}),
    #"Убрать ;" = Table.ReplaceValue(#"Убрать №",";","",Replacer.ReplaceText,{"Арт"}),

А хочется в одну строку... Можно ли в функции  Table.ReplaceValue указать сразу несколько значений для замены?
И можно ли в Table.ReplaceValue при поиске указывать "любой" символ? Например, "Игрушка * медведь", где * может быть любое кол-во символов, например, белый или черный или бурый.
Изменено: Kintoho - 8 Авг 2018 19:14:49
 
Цитата
Kintoho написал:
Можно ли в функции  Table.ReplaceValue
можно:
= Table.ReplaceValue(#"Убрать!@#", "@!#", ".", (value, old, new)=>Text.Combine(Splitter.SplitTextByAnyDelimiter(Text.ToList(old))(value),new), {"Арт"})
Цитата
Kintoho написал:
можно ли в Table.ReplaceValue при поиске указывать "любой" символ?
можно, но там уже кастомная функция посложнее будет. А что с найденным надо делать?
F1 творит чудеса
 
Доброе время суток
Цитата
Максим Зеленский написал:
Text.Combine(Splitter.SplitTextByAnyDelimiter(Text.ToList
Максим, а не проще ли было
Код
Text.Remove(value, Text.ToList(oldValue))

У ТС же просто удаление символов?
 
Андрей VG, ну если именно удаление, то конечно так проще. Я среагировал на это:
Цитата
Kintoho написал:
указать сразу несколько значений для замены
и в моем примере я заменяю на точку, кстати :)
Изменено: Максим Зеленский - 9 Авг 2018 12:32:21
F1 творит чудеса
 
Максим Зеленский, Андрей VG, спасибо за ответы!
Цитата
Максим Зеленский написал:
А что с найденным надо делать?
Удалить или поменять на символ как вы и сделали с точкой.
Цитата
Максим Зеленский написал:
= Table.ReplaceValue(#"Убрать!@#", "@!#", ".", (value, old, new)=>Text.Combine(Splitter.SplitTextByAnyDelimiter(Text.ToList(old))(value),new), {"Арт"})
Такой код работает. А можете пояснить суть записи (value, old, new) ? Я правильно понял, что это вызов функции value определяющее выражение которой указано после => и эта функция возвращает единственное значение new ?
Но не понятно как работает 4й параметр в функции ReplaceValue, ведь Значение это #"Убрать!@#" , старое значение это @!#", а новое это "." и тут по идее функция должна быть закрыта.
Replacer.ReplaceValue(value as any,  old as any,  new as any) as any

И ещё я заметил что функция убирает знак ", причём я не прошу PQ его удалять (указываю символы <)(> ), ну или получается, что прошу (ведь без "" указать значения нельзя), но как тогда быть если символ " нужно сохранить в тексте?
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Остатки"]}[Content],
    #"Замена <)(>" = Table.ReplaceValue(Источник,"<)(>", "!",(value, old, new)=>Text.Combine(Splitter.SplitTextByAnyDelimiter(Text.ToList(old))(value),new),{"Наименование"})
in
    #"Замена <)(>"
Цитата
Андрей VG написал:
Максим, а не проще ли было
Код ? 1Text.Remove(value, Text.ToList(oldValue))
У ТС же просто удаление символов?
Как написать данную конструкцию я пока что не понял, надо дальше вникать в синтаксис языка....
Да, суть задачи - удалить ненужные символы.
 
Цитата
Kintoho написал:
Удалить или поменять
Это всё же разные операции, определитесь.
Цитата
Kintoho написал:
надо дальше вникать в синтаксис языка....
Не только, но и справку читать тоже ;)
Код
Splitter.SplitTextByAnyDelimiter(Text.ToList(old), QuoteStyle.None)
 
Цитата
Kintoho написал:
суть записи (value, old, new)
Примитивное исследование показало, что по умолчанию в функции Table.ReplaceValue используется например, функция Replacer.ReplaceText, принимающая на вход 3 аргумента, в справке по ней обозванные как value, old, new. При этом понятно, что раз мы указываем в Table.ReplaceValue название функции без прямой передачи этих аргументов, значит, Table.ReplaceValue передает эти аргументы где-то внутри, хотя по сути мы их задаем там же в общих аргументах - имя столбца, старое значение, новое значение.  Но сама функция замены нас не устроила, поэтому создали свою функцию, которая также берет три аргумента, в том же порядке.
Код функций (в сокращенном представлении) пишется как (arg1, arg2, ..., argN) => function body. Можно задать типы аргументов и тип возвращаемого значения.
Цитата
(value, old, new)=>Text.Combine(Splitter.SplitTextByAnyDelimiter(Text.ToList(old))(value),new)
ну назвал их тоже value, old, new, хотя изначально они были v, o, n - тут сами имена не важны, важен порядок подачи в функцию.
Изменено: Максим Зеленский - 9 Авг 2018 18:48:06
F1 творит чудеса
Страницы: 1
Читают тему (гостей: 1)
Наверх