powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / replace для многих вариантов слов в одном поле
25 сообщений из 34, страница 1 из 2
replace для многих вариантов слов в одном поле
    #35922229
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите следующий вопрос. Хочу В ЗАПРОСЕ заменить определенные значения в поле на другие. Насколько я понимаю, возможно заменить только одно определенное значение (возможно повторяющееся несколько раз) в один запрос. Вопрос в следующем, возможно ли заменить несколько значений за один запрос, типа так:
REPLACE (поле1, "john","vova" на "johny", "vovan") - такая идея
REPLACE (поле1, "john", на "johny") - так стандартно
Конечно без "на" :), это для лучшего понимания.
Если через sql никак, может кто подскажет что-нибудь на vba!

Спасибо за помощь!!!
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922278
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вложенные реплэйсы
REPLACE (Replace(поле1, "john", "johny"),"vova", "vovan")
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922327
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, этот вариант mds_world'а хорош, но повторный Replace, по моим представлениям, способен испортить записи, когда одна комбинация букв заменяется другой, а следующая комбинация включает предыдущую. Так что будьте аккуратны.
Кроме того, не очень красиво было бы писать вложенный Replace, когда замен несколько.
Вполне вероятно, что вам потребуется либо выполнить несколько SELECT'ов (объедините их по UNION), либо напишите свою функцию, которая один массив слов заменяет на другой массив слов.
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922344
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mds_world , CoolMind
Спасибо большое за помощь!
Маленький вопросик по поводу функции для замены массивов.
Насколько я понял, писать эту функцию надо в vba (не представляю как...пока), но как совместить запрос sql и vba. Я имеею ввиду, необходимо заменить то в запросе, как в это время запустить макрос в vba ?
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922373
Фотография Restavraciya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А каким боком можно использовать реплэйс в запросе на обновление (не догнал)
IIF(....) можно
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922406
MaximuS_GНасколько я понял, писать эту функцию надо в vba (не представляю как...пока), но как совместить запрос sql и vba. Я имеею ввиду, необходимо заменить то в запросе, как в это время запустить макрос в vba ?В запросе можно использовать вызовы ваших public-функций
UPDATE Таблица SET Поле = MyFunction()
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922454
tobor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CoolMindВполне вероятно, что вам потребуется либо выполнить несколько SELECT'ов (объедините их по UNION)...
Интересный вариант. Пожалуйста, расскажите поподробнее.
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922483
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Restavraciya
Насколько я помню я нигде не упоминал про запрос на обновление :)
непоймучка
Опять же запрос не обязательно на обновление... как запустить свою функцию, например, в запросе на выборку?
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922491
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, вам потребуется использовать такой запрос:
Код: plaintext
1.
UPDATE Таблица SET поле1 = Swap([поле1])
В VBA надо будет написать функцию (извините, если будут ошибки, перед выполнением обязательно протестировать через Ctrl + G):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private function Swap (v as Variant) as Variant
  dim i as integer
  dim a() as string
  
  Redim a( 1  to  3 ,  1  to  2 )
  a( 1 ,  1 ) = "john"
  a( 1 ,  2 ) = "jonhy"
  a( 2 ,  1 ) = "vova"
  a( 2 ,  2 ) = "vovan"
  a( 3 ,  1 ) = "serg"
  a( 3 ,  2 ) = "sergy"
  for i =  1  to  3  'цикл по именам
    v = Replace(v, a(i,  1 ), a(i,  2 ))
  next
  Swap = v
end function
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922503
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю, во-первых, функция будет Public, а не Private.
Во-вторых, если это запрос Update, а не Select, то никакой UNION не применить Так что, tobor , ваш укол здесь уместен :)
В-третьих, если это даже SELECT, то всё равно, я не знаю, что будет после применения UNION... Лучше их запустить последовательно. Так что, tobor, вы меня правильно спросили...
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922519
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
toborCoolMindВполне вероятно, что вам потребуется либо выполнить несколько SELECT'ов (объедините их по UNION)...
Интересный вариант. Пожалуйста, расскажите поподробнее.
Мне кажется, чтов этом случае вы получите набор записей, в каждой из которых будет произведена только одна "атомарная" замена. В принципе, для того, чтобы получить цепь замен, в каждой из последующих надо пользоваться выходом предшествующей.

Но CoolMind прав в другом - при "вложеных" заменах верояно появление случайных ложных подстрок. Чтобы такого избежать можно каждый "атом" замены сопровождать специальным дополнительным символом, который заведомо не встречается в выборке. А потом, в окончательном реплейсе заменить этот символ на пустой. Скажем, так
Replace(REPLACE (Replace(поле1, "john", "johny|"),"vova", "vovan|"),"|", "")
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922544
MaximuS_GОпять же запрос не обязательно на обновление... как запустить свою функцию, например, в запросе на выборку?да точно так же
SELECT Поле1, MyFunction1(Поле1) AS F1 FROM Таблица
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922578
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mds_world, совершенно с Вами согласен... написал тогда и не подумал :)
мне кажется, в этом случае надо добавлять не только справа, но и слева "|"... ну для уменьшения вероятности повтора символов...
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922648
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMind
Я в access не очень разбираюсь, так что будет пару вопросов :)
Функция swap:
Redim a(1 to 3, 1 to 2)
a(1, 1) = "john"
a(1, 2) = "jonhy"
... ' создали массив имен
'можна здесь по подробнее, не могу понять что такое v, и какое количество значений у нее в конце, когда swap = v ?

for i = 1 to 3 'цикл по именам
v = Replace(v, a(i, 1), a(i, 2))
next
Swap = v

mds_world , CoolMind
Очень интересует вопрос о появлении новых значений, вообще не могу понять как они появятся ?
Буду благодарен за любой (самый примитивный) пример!

непоймучка
Спасибо!
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922726
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, я не проверял, поэтому могу ошибиться.
Функция Swap (вы можете придумать и другое имя) принимает аргумент (параметр) типа Variant и возвращает значение типа Variant. Это означает, что вы выбираете значения из таблицы, которые могут быть как строками, так и Null (в некоторых строках таблицы значения могут быть не инициализированы, а в некоторых стоят имена), а потому они входят в тип Variant. Так вот, переменная v - это то поле из таблицы, которое Вы собираетесь вставить в Swap. Вы же хотите преобразовывать значения поля в другие значения, функция swap как раз тем и занята: на вход вы ей даёте одну фразу, на выходе из неё вы получаете изменённую фразу и можете скопировать обратно в поле.
Пример появления новых значений, суперпозиция нескольких функций:
Допустим, вы заменяете "тополь" на "ива", "ива" на "Иван". В этом случае фраза "Тополь кивал головой" в разных вариантах может быть заменён так: "Тополь кивал головой" -> "Ива кивал головой" -> "иван киванл головой"
или
"Тополь кивал головой" -> "Тополь киванл головой" -> "ива киванл головой".
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922767
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть словарь в виде таблицы, где каждому значению одной строки (имени) соответствует другая строка (имя), то
можно запрос SELECT поле1 ... объединить с другим запросом, тогда и замена будет проще.
Допустим, что у тебя есть таблица (словарь) из двух полей: имя1, имя2 (john -> johny, ...)
А может, и нет...
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922831
Фотография Restavraciya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G Restavraciya
Насколько я помню я нигде не упоминал про запрос на обновление :)
непоймучка
Опять же запрос не обязательно на обновление... как запустить свою функцию, например, в запросе на выборку?А вы чтоли написали "запрос на выборку" ?
Не лечи и думай когда задаеш вопросы
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922879
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMind
Насколько я понял левые значения могут появится, только если я работаю со похожими значениями... но если я заменяю каждый раз совершенно разные значения, то такого быть не может?..
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35922971
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G,

не знаю вашу систему данных, но складывается впечатление, что замены вы хотите производить не внутри произвольного текста, а отдельных слов, т.е. сочетаний символов, либо разделенных пробелами, либо стоящих в начале фразы или заканчивающих фразу.
Т.е. в строке "иван|кивает|на|петра а петр|на|ивана" по разделителю пробел, есть три отдельных единицы подлежащих возможной замене. Это "иван|кивает|на|петра", "а" и "петр|на|ивана". А если заменить "|" на пробел: "иван кивает на петра а петр на ивана", то отдельных частей становится 8. Если так, то действие вложенных реплейсов (или показанная выше процедура) не точны, так как не отличают полного слова от подстрок, составленных из частей слова. И вам надо будет еще до замен, сначала разделить фразу на слова (по каталогу разделителей), а потом уже менять отдельные слова. Кстати, разделителями могут служить не только пробелы, но и точки, запятые, вопросительные, восклицательные знаки и т.д. Вообще, разбор тестов далеко не всегда тривиальная задача. Даже, скорее, наоборот, редко когда анализ и разбор текстов делается просто и легко.
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #35923525
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mds_world
Спасибо, большое. Мне действительно было необходимо заменять всего одно слово в записи, то-есть я не работал с предложениями.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
replace для многих вариантов слов в одном поле
    #38397090
almaz1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите пожалуйста как выкрутиться если в строке необходимо выполнить замену уж очень большого количества слов, которые содержатся в отдельной таблице, состоящей из одного столбца, т.е.
replace( @Строка, @заменяемая_подстрока, ' ' ), где @заменяемая_подстрока - столбец из другой таблицы.
Заменяю на пробел, - т.е. удаляю слова.
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #38397098
almaz1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю так:

USE facebook

DECLARE @word varchar(1000);

SELECT @word = word FROM dbo.stop_words;

UPDATE dbo.train_raw
SET body = replace( body, @word, '' ) FROM dbo.train_raw;

Но удаляется только последнее слово из таблицы stop_words
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #38397141
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
almaz1988Делаю так:

USE facebook

DECLARE @word varchar(1000);

SELECT @word = word FROM dbo.stop_words;

UPDATE dbo.train_raw
SET body = replace( body, @word, '' ) FROM dbo.train_raw;

Но удаляется только последнее слово из таблицы stop_words

Код: sql
1.
UPDATE dbo.train_raw, dbo.stop_words SET dbo.train_raw.body = replace(dbo.train_raw.body, dbo.stop_words.word, '')
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #38397149
almaz1988
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport, авторUPDATE dbo.train_raw, dbo.stop_words SET dbo.train_raw.body = replace(dbo.train_raw.body, dbo.stop_words.word, '')
выдает ошибку: Не удалось привязать составной идентификатор "dbo.stop_words.word".

Следующий код удаляет только первую подстроку из таблицы stop_words:
Код: sql
1.
2.
3.
UPDATE dbo.train_raw 
	SET dbo.train_raw.body = replace( dbo.train_raw.body, dbo.stop_words.word, '')
	FROM dbo.train_raw CROSS JOIN dbo.stop_words;
...
Рейтинг: 0 / 0
replace для многих вариантов слов в одном поле
    #38397178
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
almaz1988guest_rusimport, авторUPDATE dbo.train_raw, dbo.stop_words SET dbo.train_raw.body = replace(dbo.train_raw.body, dbo.stop_words.word, '')
выдает ошибку: Не удалось привязать составной идентификатор "dbo.stop_words.word".

Следующий код удаляет только первую подстроку из таблицы stop_words:
Код: sql
1.
2.
3.
UPDATE dbo.train_raw 
	SET dbo.train_raw.body = replace( dbo.train_raw.body, dbo.stop_words.word, '')
	FROM dbo.train_raw CROSS JOIN dbo.stop_words;


дык, а что вы с МС СКЛ -ем в Акцессе спрашиваете ?

а вообще, или курсором, или функцию типа такой
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create function (@body varchar(max))
returns varchar(max)
as
begin
	select @body=replace(@body, word, '')
	from stop_words
	--   
  	return @body
end


использовать в запросе UPDATE
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / replace для многих вариантов слов в одном поле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]