Страницы: 1 2 След.
RSS
Макросс для интерактивной замены предлогов
 
Добрый день. Нужна помощь с такой задачей. Есть БД на 4000 значений состоящих из словосочетаний. Нужно найти предлоги (допустим предлог "с"), и заменить его на предлог с добавкой ("+с" допустим). При этом простая замена не работает чётко, так как может заменять в словах что-то, (допустим слово "доска" замениться на "до+ска"). Подумалось,  что можно пустить ограничение, через условный оператор на количество символов, что бы программа находила значение, считала его количество букв в найденном слове, и если оно соответствует заданному критерию, меняла, а если нет - пропускала. Подскажите, как это можно сделать.
Изменено: Apoctol - 07.07.2016 23:08:03 (Добавил решение проблемы в шапку)
 
а что мешает заменять " с " (пробел с пробел) на "+с"?
Соблюдение правил форума не освобождает от модераторского произвола
 
Частично - ничего. Но во фразе "с металлом", к примеру, это фишка не работает, ибо пробел лишь с одной стороны
 
Цитата
Apoctol написал: ибо пробел лишь с одной стороны
тогда откажитесь от затеи или включите смекалку :) Ведь можно же в отдельный столбец формулой записать значение, добавив спереди и сзади пробелы. Тогда в любом случае можно будет отделить предлоги, опираясь на то, что спереди и сзади предлогов будут пробелы в любом случае.
Если не в отдельный столбец и кодом - то, конечно, можно пробелы "имитировать" перед заменой.
Изменено: The_Prist - 06.07.2016 21:05:05
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Добавлять спереди и сзади добавлять пробелы не вариант, ибо вся база копируется, а вписывать всё в ручную - это проблематично. Отделять предлоги тоже нельзя, в виду того, что должно быть одна ячейка - одна фраза. Ну требование такое. Я это всё обдумал, и единственный вариант как раз кодом и остался.
 
Проверьте, так?
Код
Sub F()
    With CreateObject("VBScript.RegExp")
        .Pattern = "(^|\s)с\s"
        MsgBox .Replace("доска", " +с ")
        MsgBox .Replace("не с ним", " +с ")
        MsgBox .Replace("с ним", " +с ")
    End With
End Sub
Изменено: Rayman - 06.07.2016 20:55:28 (Изменил код)
 
Выкидывает три окошка, и на этом всё
 
Цитата
Apoctol написал: Выкидывает три окошка, и на этом всё
А что нужно? В "окошках" показывается результат )
 
Нужно, что бы в ячейках менялось значение
 
В какие ячейки? Вы нам показали файл, где будет несколько строк с различными данными? А вот для этого нужно следовать Правилам:
Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
 
Цитата
Юрий М написал: Вы нам показали файл, где будет несколько строк с различными данными?
Пардон, думал и так всё понятно. Пример скинул. Суть вроде бы описал. В ячейках есть словосочетания, в словосочетаниях есть предлоги. Надо найти все предлоги, и заменить, не затронув при этом слова.
 
Цитата
Apoctol написал: Пардон, думал и так всё понятно.
Да понятно, но не должны помогающие за Вас наполнять таблицы данными.
 
Цитата
Apoctol написал:
допустим предлог "с"
Только "с"? или все предлоги?
Apoctol, вы бы вместо 350 лучше бы строк 30-50 показали, и результат, что нужно.
 
Все предлоги, но на примере с я смогу сделать всё остальное. Могу скинуть то, как это должно выглядеть, если надо, просто я уже замучался высматривать в этих строчках хоть что-то:)
 
Цитата
Михаил С. написал: результат, что нужно.
Всё, исправил примерчик.
 
Имхо, как-то так
 
Михаил С., А почему когда в коде убираешь пробел спереди, то программа не находит предлоги в начале ячейки?
 
Потому, что ищет предлог с пробелом спереди и сзади.
Сзади к тексту пробел можно не добавлять, наверное - в русском языке предлог не может быть последним, а спереди надо.
 
Михаил С.,Так я в коде убираю поиск с пробелом спереди, а программа всё равно не находит пробелы в начале текста.
 
Цитата
Apoctol написал: Так я в коде убираю поиск с пробелом
А зачем? вас этот пробел напрягает?
 
Михаил С.,Просто в начале ячейки тоже бывают предлоги. Вроде "Без руля". И их тоже надо проплюсовать.
Изменено: Apoctol - 07.07.2016 14:04:45 (Исправил опечатку)
 
Цитата
Apoctol написал: в начале ячейки тоже бывают пробелы. Вроде "Без руля"
не понял. А где в этой строке пробел в начале ячейки?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist,Спасибо. Мой косяк.
 
Если искать предлоги без пробелов спереди, то данный алгоритм слово "колесо" превратит в "коле+с+о" (сначала заменит "со" на "+со", а потом последнее "о" на "+о").
А вот для того, что бы найти " без " в вашем  "Без руля" мы превращаем его в " Без руля "
 
Михаил С., фактически может быть и в конце предложения, например когда в приличном обществе посылают кого-нибудь, то часто используют фразу "иди на..." или "иди в...". Или же какой-нибудь авторский текст где автор сознательно искажает построение фразы.
Кстати, после предлога может идти знак препинания, например "в этом тексте чаще других встречаются предлоги в, на и с"
Не стреляйте в тапера - он играет как может.
 
Цитата
Ts.Soft написал: Кстати, после предлога может идти знак препинания,
да, про это я забыл, но алгоритм есть, добавить несложно.

зы. Но, имхо, в данном случае это редкий вариант. (здесь тоже после но запятая :) )
Изменено: Михаил С. - 09.07.2016 19:57:06
 
Михаил С.,То есть по факту алгоритм выискивает все предлоги с пробелами справа и слева. Но если пробел только справа, то надо в такой предлог внести пробел слева. Ручками. Я правильно понимаю?
 
Цитата
Apoctol написал: Ручками. Я правильно понимаю?
неправильно. Макрос это делает сам. В строке
Код
Str = " " & Cel.Value & " "
а затем в строке
Код
Cel.Value = Trim(Str)
эти пробелы удаляются.
Изменено: Михаил С. - 09.07.2016 19:57:15
 
Михаил С.,Странно. Если пробелы с двух сторон - работает. Если с одной - не работает.
Ну т.е "Без руля" не меняет
Изменено: Apoctol - 07.07.2016 14:44:43
 
Потому, что в листе "Список предлогов" предлоги уже с пробелами спереди и сзади. Там нет "без", там есть " без ", поэтому он не может найти "без ".
Страницы: 1 2 След.
Читают тему
Наверх