Здравствуйте! Пишу скорее из спортивного интереса, нежели от острой необходимости , т.к. я даже приблизительно не представляю реализацию затеи (читать как "миссия невыполнима"). Есть колонка "L" с текстом. В тексте может содержаться адрес "улица, дом" в разных вариациях. На втором листе ("Улицы") есть полный перечень улиц, благодаря которому, название улицы вытягивается в колонку "К". Макрос тоже в файле. Вопрос. Реально ли копировать в колонку "К" полный адрес, включая номер дома, а иногда и номер дома с буквой? Интересен любой ответ!
Здравствуйте! Пишу скорее из спортивного интереса, нежели от острой необходимости , т.к. я даже приблизительно не представляю реализацию затеи (читать как "миссия невыполнима"). Есть колонка "L" с текстом. В тексте может содержаться адрес "улица, дом" в разных вариациях. На втором листе ("Улицы") есть полный перечень улиц, благодаря которому, название улицы вытягивается в колонку "К". Макрос тоже в файле. Вопрос. Реально ли копировать в колонку "К" полный адрес, включая номер дома, а иногда и номер дома с буквой? Интересен любой ответ!emkub
Можно попытаться сделать полуавтоматический способ. Вы запускаете макрос, появляется диалоговое окно, в котором данные из столбца L из первой ячейки. Вы выделяете адрес, кликаете Далее - выделенные данные копируются в столбец K, а в диалоговое окно подставляются данные из следующей ячейки столбца L. И так далее.
Можно попытаться сделать полуавтоматический способ. Вы запускаете макрос, появляется диалоговое окно, в котором данные из столбца L из первой ячейки. Вы выделяете адрес, кликаете Далее - выделенные данные копируются в столбец K, а в диалоговое окно подставляются данные из следующей ячейки столбца L. И так далее.Karataev
Сообщение отредактировал Karataev - Четверг, 17.03.2016, 14:51
Закономерность есть. За названием улицы следует или "," или пробел. Если сразу за ними есть цифры - это номер дома, если после цифр, вплотную, одна буква - то она тоже относится к номеру дома. Другое дело - реализация алгоритма! Это ДА!.... вынос мозга
Закономерность есть. За названием улицы следует или "," или пробел. Если сразу за ними есть цифры - это номер дома, если после цифр, вплотную, одна буква - то она тоже относится к номеру дома. Другое дело - реализация алгоритма! Это ДА!.... вынос мозга emkub
Или ещё. Выносить в соседнюю колонку совпадающее название улицы + следующие 6 знаков. Затем, "волшебным образом" обрабатывать те самые 6 знаков...
Или ещё. Выносить в соседнюю колонку совпадающее название улицы + следующие 6 знаков. Затем, "волшебным образом" обрабатывать те самые 6 знаков...emkub
Алгоритм поиска текстового фрагмента "Номер дома/квартиры": 1. Забираем в буфер N символов после улицы 2. Удаляем в нем все небуквенные фрагменты, предшествующие специфическим кускам - по данным примерам индикаторы - это "кв.м", "м2", "-ком". Пояснение: в строке "Вышгородская" удаляем "1-ком" и "51.4м2". В строке "Кольцова" убираем "5, 62 кв.м" 3. Если в оставшихся символах нет чисел - значит не нашли(питерские варианты с литерами можно, конечно, учитывать, но это экзотика). Если есть, ищем последнюю цифру, от нее еще оставляем всё до первого пробела/знака препинания, остальное отбрасываем.
Вообще, тема для очень приличного по сложности макроса.
Алгоритм поиска текстового фрагмента "Номер дома/квартиры": 1. Забираем в буфер N символов после улицы 2. Удаляем в нем все небуквенные фрагменты, предшествующие специфическим кускам - по данным примерам индикаторы - это "кв.м", "м2", "-ком". Пояснение: в строке "Вышгородская" удаляем "1-ком" и "51.4м2". В строке "Кольцова" убираем "5, 62 кв.м" 3. Если в оставшихся символах нет чисел - значит не нашли(питерские варианты с литерами можно, конечно, учитывать, но это экзотика). Если есть, ищем последнюю цифру, от нее еще оставляем всё до первого пробела/знака препинания, остальное отбрасываем.
Вообще, тема для очень приличного по сложности макроса.abtextime
Первая часть частично решена. Относительно не сложная формула (=ПСТР(НАЙТИ(ДЛСТР))) выводит в отдельную ячейку заданное количество символов. Думаю "запись макроса" по формуле - дело нехитрое. Остаётся разными "еслями" убрать лишнее и соединить нужные ячейки
Первая часть частично решена. Относительно не сложная формула (=ПСТР(НАЙТИ(ДЛСТР))) выводит в отдельную ячейку заданное количество символов. Думаю "запись макроса" по формуле - дело нехитрое. Остаётся разными "еслями" убрать лишнее и соединить нужные ячейки emkub
А за другими словами нет ни пробелов ни запятых...? Не вижу закономерности! Но если не шибко много строк, можно разбить строки по столбцам и кликом выбирать улицу, а уж № дома рядом.
А за другими словами нет ни пробелов ни запятых...? Не вижу закономерности! Но если не шибко много строк, можно разбить строки по столбцам и кликом выбирать улицу, а уж № дома рядом.Wasilich
Закономерность: "название улицы" - "запятая и/или пробел" - "номер дома" - "возможная буква дома". Wasilich, предложенный Вами вариант - не вариант. Строк много, текст может быть весьма объёмным, да и далеко не всегда номер дома вообще присутствует. Я выше написал формулу, по которой я получаю нужное количество символов сразу за названием улицы. Обрабатывать кусочек из 5-6 символов немного проще, чем текст из 10 предложений :) От советов по обработке этих 5-6 символов не откажусь!
Закономерность: "название улицы" - "запятая и/или пробел" - "номер дома" - "возможная буква дома". Wasilich, предложенный Вами вариант - не вариант. Строк много, текст может быть весьма объёмным, да и далеко не всегда номер дома вообще присутствует. Я выше написал формулу, по которой я получаю нужное количество символов сразу за названием улицы. Обрабатывать кусочек из 5-6 символов немного проще, чем текст из 10 предложений :) От советов по обработке этих 5-6 символов не откажусь!emkub
Сообщение отредактировал emkub - Пятница, 18.03.2016, 11:30
Если бы у Вас данные соответствовали описания из сообщения #1, можно было бы делать вот такой регуляркой [vba]
Код
Function tt(Text As String, N As Integer) As String 'Text адрес, в котором проводится поиск 'N 1 - для названия улицы, 2 - для номера дома Dim obj As Object With CreateObject("VBScript.RegExp") .IgnoreCase = True .Pattern = "(?:ул|пер|пр-т|бульв)\.? ?(.+), ?(\d+-?[а-яё]?)" Set obj = .Execute(Text) If obj.Count = 0 Then Exit Function tt = obj(0).submatches(N - 1) End With End Function
[/vba] Но у Вас там полный бардак, названия зачастую идут вообще без "преамбулы" и в родительном падеже, после названия улицы может не быть запятой и номера дома, проспект сокращается и пр., и пр-т. Кое что из этого можно попробовать поправить за счет серьезного усложнения патерна, но как обойти первый пункт я не представляю (а с учетом родительного падежа, лаже поиск в списке названий улиц не поможет). Если Вы приложили неправильны пример, приложите другой - посмотрим, подуаем...
Если бы у Вас данные соответствовали описания из сообщения #1, можно было бы делать вот такой регуляркой [vba]
Код
Function tt(Text As String, N As Integer) As String 'Text адрес, в котором проводится поиск 'N 1 - для названия улицы, 2 - для номера дома Dim obj As Object With CreateObject("VBScript.RegExp") .IgnoreCase = True .Pattern = "(?:ул|пер|пр-т|бульв)\.? ?(.+), ?(\d+-?[а-яё]?)" Set obj = .Execute(Text) If obj.Count = 0 Then Exit Function tt = obj(0).submatches(N - 1) End With End Function
[/vba] Но у Вас там полный бардак, названия зачастую идут вообще без "преамбулы" и в родительном падеже, после названия улицы может не быть запятой и номера дома, проспект сокращается и пр., и пр-т. Кое что из этого можно попробовать поправить за счет серьезного усложнения патерна, но как обойти первый пункт я не представляю (а с учетом родительного падежа, лаже поиск в списке названий улиц не поможет). Если Вы приложили неправильны пример, приложите другой - посмотрим, подуаем...МВТ
Нет, пример взят из оригинала, 1 в 1 . Он полностью правильный. Скажу даже больше, в оригинальном файле (а он большой), вариаций ещё больше и к тому же, названия улиц и домов могут находиться в ДВУХ столбцах! Я взял в пример самые распространённые строки и только один столбец, т.к. интересен сам принцип решения.
Нет, пример взят из оригинала, 1 в 1 . Он полностью правильный. Скажу даже больше, в оригинальном файле (а он большой), вариаций ещё больше и к тому же, названия улиц и домов могут находиться в ДВУХ столбцах! Я взял в пример самые распространённые строки и только один столбец, т.к. интересен сам принцип решения.emkub
Невозможно настроить действительно надежно работающий инструмент на иррегулярных текстовых "ручных" данных. И более того, это методически вредно. Т.к. немногочисленные ошибки, которые неизбежно будут сочиться через такое дырявое сито, опасны именно своей неуловимостью.
А что мешает при вводе объявлений навесит на веб-морду ввода объявления адресную базу? Пусть, клиент если хочет, вводит адрес через нее. И дисклеймер подвесить - любую адресную информацию в теле объявления имеем право похерить, т.к. она не верифицируется при вводе. Иногда проще в консерватории что-то поправить, чем переучивать херовых музыкантов.
Невозможно настроить действительно надежно работающий инструмент на иррегулярных текстовых "ручных" данных. И более того, это методически вредно. Т.к. немногочисленные ошибки, которые неизбежно будут сочиться через такое дырявое сито, опасны именно своей неуловимостью.
А что мешает при вводе объявлений навесит на веб-морду ввода объявления адресную базу? Пусть, клиент если хочет, вводит адрес через нее. И дисклеймер подвесить - любую адресную информацию в теле объявления имеем право похерить, т.к. она не верифицируется при вводе. Иногда проще в консерватории что-то поправить, чем переучивать херовых музыкантов.abtextime
Да, согласен, при такой подаче информации, промашки могут быть. А информация берётся из разных источников, по этому невозможно привести её к общему знаменателю. Но я УЖЕ уверен, что смогу это сделать!
Да, согласен, при такой подаче информации, промашки могут быть. А информация берётся из разных источников, по этому невозможно привести её к общему знаменателю. Но я УЖЕ уверен, что смогу это сделать!emkub
Вопрос наверное к MBT. Как раз по части регулярных выражений. Подскажите, как выполнить удаление ДВУХ символов слева от "/", ДВУХ символов справа от "/" и сам "/"? (пример: 12/21)
Вопрос наверное к MBT. Как раз по части регулярных выражений. Подскажите, как выполнить удаление ДВУХ символов слева от "/", ДВУХ символов справа от "/" и сам "/"? (пример: 12/21)emkub
Благодарю за оперативность! Отношение имеет прямое. Я пошёл таким путём: в отдельную колонку вынес 8 знаков после названия улицы. САМОЕ часто-встречаемое "нарушение" циферной закономерности - указание этажа/этажности через "/". На мой скромный взгляд, первое, что нужно убрать - именно эти цифры. Хотя изредка проскакивает и дробный номер дома, но это относительная редкость и им можно пожертвовать. Сейчас отсекаю лишние символы.
Благодарю за оперативность! Отношение имеет прямое. Я пошёл таким путём: в отдельную колонку вынес 8 знаков после названия улицы. САМОЕ часто-встречаемое "нарушение" циферной закономерности - указание этажа/этажности через "/". На мой скромный взгляд, первое, что нужно убрать - именно эти цифры. Хотя изредка проскакивает и дробный номер дома, но это относительная редкость и им можно пожертвовать. Сейчас отсекаю лишние символы.emkub
emkub, Вы смотрите в неправильную сторону. Если у Вас юзвери вводят данные ручками, дайте им ДВА поля для ввода — одно адрес, другое — прочая лирика. А уж ввести между ними уникальный разделитель, который юзверь либо не станет вводить (например, ~), либо не сможет из-за трудоёмкости (например, неразрывный пробел или перевод каретки) — вопрос техники.
emkub, Вы смотрите в неправильную сторону. Если у Вас юзвери вводят данные ручками, дайте им ДВА поля для ввода — одно адрес, другое — прочая лирика. А уж ввести между ними уникальный разделитель, который юзверь либо не станет вводить (например, ~), либо не сможет из-за трудоёмкости (например, неразрывный пробел или перевод каретки) — вопрос техники.StoTisteg
Интуитивно понятный код - это когда интуитивно понятно, что это код.