Страницы: 1
RSS
в Power Query пытаюсь заменить содержимое одного столбца на содержимое соседнего через Table.ReplaceValue. Вместо данных получаю List, в Power Query пытаюсь заменить содержимое одного столбца на содержимое соседнего через Table.ReplaceValue. Вместо данных получаю List
 
Добрый день

Неожиданно судьба свела меня с Power Query
У нас был штатный специалист по Excel и Power Query, но он нас покинул (нет-нет, жив-здоров-свободен, но недоступен).
Поэтому мне пришлось - "пионер, ты в ответе за все" ...
Какие-то вещи я понял исходя из предыдущих работ нашего специалиста. Но некоторые нет. Либо голова у меня не так работает, либо логику не понимаю.

Вот простейшая, казалось бы, задача:
В таблице две колонки (их больше, но интересуют только две). Обе текстовые. В одной есть часть записей со значением null, в другой все правильные.
Для определенности, "Счет №1" с "null", "Счет №2" - правильный

Из текстов (запросов Power Query) нашего потерявшегося спеца я понял, что просто так с "null" работать нехорошо. Окей, заменю "null" на что-то более приличное:
   
Код
#"Замененное значение2" = Table.ReplaceValue(#"Замененное значение1",null,"Empty",Replacer.ReplaceValue,{"Счет №1"}),

Отлично работает, все "null" стали "Empty". Теперь хочу все, где "Empty" заменить на аналогичные (из той же строки) из колонки "Счет №2":    
 
Код
 #"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty",{"Счет №2"},Replacer.ReplaceValue,{"Счет №1"})

А вместо значений вижу "List" во всех замененных ячейках. Пробовал так же:
   
Код
#"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty",{"#Счет №2"},Replacer.ReplaceValue,{"Счет №1"})
не особо понимая разницу между {"#Счет №2"} и {"Счет №2"}. Снова "List" вместо значений.

Хелп от Microsoft ничего на эту тему не говорит... Словом, прошу помощи - как мне заменить текст "Empty" на значение из соседней ячейки именно в Power Query, потому что мне дальше надо ковыряться именно в нем. (в самом экселе это элементарная задача).
 
не те скобки используете
 
а... квадратные нужны?

нет.. ругается...
Изменено: AlexDen - 27.02.2024 13:14:58
 
ну же, фантазируйте ))
...кавычки...
 
Цитата
написал:
хочу все, где "Empty" заменить на аналогичные (из той же строки)
если из той же строки - то надо не Talbe.ReplaceValue использовать, а создание дополнительного вычисляемого столбца, в котором применить Text.Replace
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
вот вам смешно...мне тож смешно.
только я всего 2-ю неделю с этим монстром (Power Query) бьюсь, а вы года с 18-го
 
Вы текстовое значение "empty" меняете на список, состоящий из одного элемента, элемент является текстом "#Счет №2". Правила форума требуют прикладывать пример, но если это - непосильно, поищите по форуму, задача тут 100500 раз решалась.
Изменено: Xel - 27.02.2024 13:23:27
 
вот так пробуйте
Код
#"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty", each[#"Счет №2"],Replacer.ReplaceValue,{#"Счет №1"})
Изменено: nilske - 27.02.2024 13:39:48
 
Код
#"Замененное значение3" = Table.ReplaceValue(#"Замененное значение2","Empty", each [#"Счет №2"], Replacer.ReplaceValue,{"Счет №1"})
 
Дмитрий(The_Prist) Щербаков, nilske, Alex, Большое спасибо,
сейчас попробую.
Оказывается, этот Power Query превращает в тыкву обычную офисную машину (8 Гб RAM, iCore 3 какой-то старый хоть и c SSD)... Нужно нечто "более другое" иначе любое движение продолжается мучительно долго

Да,  nilske, Alex, ваша команда делает ровно то, что я хочу.

Еще раз, большое спасибо всем за просвещение.
Изменено: AlexDen - 27.02.2024 14:08:51
 
Цитата
Alex написал:
Нужно нечто "более другое" иначе любое движение продолжается мучительно долго

Если данных много, то Table.ReplaceValue - довольно тормозная штука. И вы его зачем-то прогоняете 2 раза для того, чтобы null заменить на правильное значение. Если такого как следует накрутить, то никакого компа может не хватить.
Изменено: Xel - 27.02.2024 14:36:08
 
Цитата
написал:
Если данных много, то Table.ReplaceValue - довольно тормозная штука. И вы его зачем-то прогоняете 2 раза для того, чтобы null заменить на правильное значение. Если такого как следует накрутить, то никакого компа может не хватить.
Если null можно впрямую заменять на each [#"Счет №2"], с удовольствием выкину лишнюю строку.
3000 строк это много или мало - не зная масштабов не скажу.
Что до "накрутить", тут я могу. Разумеется, по незнанию.
Вообще, в задачах просматривается под 1000 файлов на сетевом ресурсе, что само по себе тормозит процесс, плюс всяческие выборки из этих файлов...
Короче, далеко не оптимально построенный процесс. Но моих познаний в том же Power Query явно не достаточно для того, что бы вот так взять что-то и глобально оптимизировать. Пока по мелочи работаю - в пределах своего понимания
 
Задача состоит в том, что если в столбце1 стоит null, то заменить его на значение из столбца2, а если в столбце значение, отличное от null, то оставить его?
Если я так правильно понял задачу, то зачем все эти танцы с заменами - просто создать вычисляемый столбец с самой простой формулой:
if [Столбец1]=null then [Столбец2] else [Столбец1]
По крайней мере, я так понял, что null заменяется на empty, а empty на значение из второго столбца. Зачем эта промежуточная замена?
Изменено: voler83 - 27.02.2024 18:13:36
 
voler83, спасибо за ответ

Alex иnilske, уже предложили рабочее решение
 
AlexDen, вы пишите, что у вас все виснет - абсолютно не настаиваю, но если мое решение по смыслу правильное, то виснуть должно меньше по идее.Если так критичны зависания, то надо удалять все ненужные шаги.
Изменено: voler83 - 28.02.2024 10:51:58
 
Цитата
AlexDen написал:
уже предложили рабочее решени
Рабочее решение - не использовать Table.ReplaceValue для такой задачи. Вам корректно ответили на вопрос о синтаксисе функции.
 
Xel, немного на грубость смахивает )
если для пользователя данное решение работает и устраивает, то зачем навязывать свою точку зрения
каждому нужно разное время чтобы "дойти" но новых вопросов,  если тема вообще будет интересна.
если критикуете его выбор - предлагайте другой вариант.
Изменено: nilske - 28.02.2024 11:51:05 (если)
 
Xel, voler83,я понимаю, что вы из лучших побуждений предлагаете ПРАВИЛЬНЫЙ вариант (то есть, тот, что не только делает требуемое, но и делает это оптимально). Огромное вам спасибо за небезразличие к процессу. Просто предложенную вами команду я в "записках потерявшегося программера" пока не встречал. Потому мне придется тратить дополнительное время на изучение этой штуки. Полностью соглашусь, что это ущербная модель работы, так нельзя подходить к решению. Но приходится. У меня нет недель-месяцов на понимание идеологии Power Query. Я обычный, достаточно уверенный пользователь Excel - в рамках решаемых задач, разумеется - на которого свалилось вот это счастье. Более того, я не могу оценить мастерство нашего программера. Его решения выполняли задачи. Оптимально ли, нет, не знаю. Но работали. И продолжают работать.
Кстати, он наверняка на этом форуме есть. Я тут много чего полезного нашел для себя.
В общем, "не стреляйте в пианиста, он играет как умеет" (с)

UDP. Будет время, попробую ваш способ. Если он как-то dramatically повысит скорость процесса, с удовольствием задействую его.
Изменено: AlexDen - 29.02.2024 06:21:28
 
Цитата
написал:
если из той же строки - то надо не Talbe.ReplaceValue использовать, а создание дополнительного вычисляемого столбца, в котором применить Text.Replace
вчера задействовал ваш вариант. работает. спасибо.
не знаю, правильно ли я понимаю логику, но тут пришлось делать так:
создать доп.столбец, в нем все вычислить;
удалить предыдущий;
переименовать созданный столбец в удаленный;
поместить его на место удаленного (не знаю, может и не нужно, но на всякий случай, вдруг имеет значение).

По крайней мере, так оно работает. Насколько эффективно, не знаю. Опыта мало для оценки
Изменено: AlexDen - 22.03.2024 10:03:31
 
Цитата
AlexDen написал:
создать доп.столбец
...
поместить его на место удаленного
Не замарачиваясь так и делаю.
Цитата
AlexDen написал:
просто так с "null" работать нехорошо
null тоже можно заменять. Например, так
Код
= Table.ReplaceValue(#"Замененное значение1",null,each [#"Счет №2"],(a,b,c)=> if a = b then c else a,{"Счет №1"})
 
Цитата
Цитата
Михаил Л написал:
Не замарачиваясь так и делаю.
Спасибо за поддержку.
я учусь.
да, логика иногда странноватая с моей точки зрения, зато много чего можно делать просто менюшками и окнами.
В общем, язык [программирования] как язык, плюс ИИ подсказывает направление, без него дольше бы ковырялся. ну и форумы вроде этого весьма полезны, когда знаешь что искать.
и, как выяснилось, VBA тоже на мою голову свалился. Потому как часть вещей Power Query делать не умеет в принципе, зато умеет VBA. Другую часть может VBA и умеет, да в Power Query это проще и быстрее получить.
и, да, винду ему подавай, да еще и русскую, где все нормальные эксельные команды типа vconnect звучат как минимум непривычно. один "просмотрX" с англ буквой "X" чего стоит...
ну да ладно, учусь
Изменено: AlexDen - 03.04.2024 09:32:36
Страницы: 1
Наверх