Помогите, пожалуйста, составить запрос на Python/VB
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Помогите, пожалуйста, составить запрос на Python/VB
Подскажите, можно ли извлечь из строки с адресом название улицы с помощью запроса? Или где почитать можно?
Примеры такие
"г.Санкт-Петербург, Бухарестская улица, дом 1, литера А" - нужно вытащить название улицы (например, от "г. Санкт-Петербург, " до "дом")
"г. Санкт-Петербург, город Петергоф, Суворовская улица, дом 3, корпус 11, литера А" - нужно вытащить также название улицы и дополнительно "город Петергоф"
Примеры такие
"г.Санкт-Петербург, Бухарестская улица, дом 1, литера А" - нужно вытащить название улицы (например, от "г. Санкт-Петербург, " до "дом")
"г. Санкт-Петербург, город Петергоф, Суворовская улица, дом 3, корпус 11, литера А" - нужно вытащить также название улицы и дополнительно "город Петергоф"
- Sasfeat
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 20 фев 2013, 18:18
- Репутация: 13
- Откуда: Ухань
- Контактная информация:
Re: Помогите, пожалуйста, составить запрос на Python/VB
Как у вас данные принимаются? Просто строка приходит? Последовательность стандартная? слово "улица" всегда указывается?
[ Сообщение с мобильного устройства ]
[ Сообщение с мобильного устройства ]
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Помогите, пожалуйста, составить запрос на Python/VB
Я работаю через интерфейс Arcmap, слово улица - не всегда, иногда - проспект, бульвар и т. д.
Но всегда перед геонимом стоит г. Санкт-Петербург или г. Санкт-Петербург, город Зеленогорск (например).
Но всегда перед геонимом стоит г. Санкт-Петербург или г. Санкт-Петербург, город Зеленогорск (например).
-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
Re: Помогите, пожалуйста, составить запрос на Python/VB
Понимаю, что это жесточайший костыль, но я не программист, извините)
У Вас может оказаться множество разных тонкостей в данных, но на конкретных примерах сработало. По крайней мере, надеюсь, навести Вас на какие-то мысли.
1. #поле с адресом# = Replace([#поле с адресом#], "г.С", "г. С")
2. #поле для улицы# = Mid([#поле с адресом#],21)
3. #какое-то вспомогательное поле целочисленного типа# = InStr([#поле для улицы#], ", дом")
4. #поле для улицы# = Left([#поле для улицы#], [#какое-то вспомогательное поле целочисленного типа#]-1)
*Для калькулятора поля в ArcGIS.
У Вас может оказаться множество разных тонкостей в данных, но на конкретных примерах сработало. По крайней мере, надеюсь, навести Вас на какие-то мысли.
1. #поле с адресом# = Replace([#поле с адресом#], "г.С", "г. С")
2. #поле для улицы# = Mid([#поле с адресом#],21)
3. #какое-то вспомогательное поле целочисленного типа# = InStr([#поле для улицы#], ", дом")
4. #поле для улицы# = Left([#поле для улицы#], [#какое-то вспомогательное поле целочисленного типа#]-1)
*Для калькулятора поля в ArcGIS.
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Помогите, пожалуйста, составить запрос на Python/VB
Спасибо, сейчас попробую!
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Помогите, пожалуйста, составить запрос на Python/VB
На Python в калькуляторе полей, если не заморачиваться с регулярками, будет как-то так:
Здесь !fieldname! — имя вашего поля; в фигурных скобках дано множество токенов, сигнализирующих о том, что элемент адреса является улицей. Предполагается, что элементы адреса разделены запятой.
Протестировал в ArcGIS 10.3 на шейп-файле — вроде работает. На других версиях надо проверять: там, помнится, были какие-то проблемы с юникодом в калькуляторе полей.
Код: Выделить всё
', '.join(
filter(
lambda y: set(y.split()) & { u'улица', u'переулок', u'бульвар' },
(x.strip() for x in !fieldname!.split(','))
)
) if !fieldname! else ''
Здесь !fieldname! — имя вашего поля; в фигурных скобках дано множество токенов, сигнализирующих о том, что элемент адреса является улицей. Предполагается, что элементы адреса разделены запятой.
Протестировал в ArcGIS 10.3 на шейп-файле — вроде работает. На других версиях надо проверять: там, помнится, были какие-то проблемы с юникодом в калькуляторе полей.
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Помогите, пожалуйста, составить запрос на Python/VB
Круто, супер-круто! Все работает!!! В общем, ура.
Не подскажете ли, с чего следует начать, чтобы научиться так же? Достаточно ли такого будет изучить https://docs.python.org/2/reference/index.html или это делается с каким-то другим уровнем знания программирования?
Не подскажете ли, с чего следует начать, чтобы научиться так же? Достаточно ли такого будет изучить https://docs.python.org/2/reference/index.html или это делается с каким-то другим уровнем знания программирования?
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Помогите, пожалуйста, составить запрос на Python/VB
Достаточно. Это базовые структуры данных Python и функции работы со строками. Я сам, по-моему, ни одной книжки по Python до конца не прочёл, а вот справкой пользуюсь постоянно. А опыт приходит в процессе работы, иначе никак.
Единственное, в Language Reference синтаксис изложен чересчур формально, для практического использования лучше вот это:
https://docs.python.org/2/tutorial/index.html
На самом деле, не обязательно писать всё в одно выражение, можно определить функцию, используя более привычный императивный стиль, и вызывать её. В данном случае я разбиваю исходную строку на список элементов (в строке они разделены запятой), удаляю лишние пробелы в начале и конце (чтобы они не попали в результат), каждый элемент разбиваю на множество слов и фильтрую список элементов в зависимости от того, пересекается ли это множество с известным множеством. Отфильтрованный список вновь склеивается в строку через запятую (хотя, как правило, в нём всего один элемент). Ну ещё вставлено условие для проверки на пустые значения.
Единственное, в Language Reference синтаксис изложен чересчур формально, для практического использования лучше вот это:
https://docs.python.org/2/tutorial/index.html
На самом деле, не обязательно писать всё в одно выражение, можно определить функцию, используя более привычный императивный стиль, и вызывать её. В данном случае я разбиваю исходную строку на список элементов (в строке они разделены запятой), удаляю лишние пробелы в начале и конце (чтобы они не попали в результат), каждый элемент разбиваю на множество слов и фильтрую список элементов в зависимости от того, пересекается ли это множество с известным множеством. Отфильтрованный список вновь склеивается в строку через запятую (хотя, как правило, в нём всего один элемент). Ну ещё вставлено условие для проверки на пустые значения.
-
- Гуру
- Сообщения: 5355
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Помогите, пожалуйста, составить запрос на Python/VB
а ещё можно использовать RegEx
-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Помогите, пожалуйста, составить запрос на Python/VB
Спасибо большое за рекомендации. Я правильно понимаю, что для использования регулярных выражений все равно нужно знать синтаксис какого-нибудь языка?
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Помогите, пожалуйста, составить запрос на Python/VB
Для использования регулярных выражений в Python нужно всего лишь импортировать модуль re и вызывать его функции. Но во многих случаях синтаксис Python читабельнее, и отлаживать его проще. Регулярки хороши там, где нужны стандартные действия со строками (выделение подстроки, разбиение, подстановка) с использованием довольно сложных шаблонов поиска. Однако для более сложных задач синтаксического разбора их возможностей вновь становится недостаточно. Знать и уметь применять регулярные выражения, конечно, надо, они часто выручают, особенно при обработке грязных и плохо структурированных данных.
-
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 мар 2015, 10:01
- Репутация: 24
- Откуда: Санкт-Петербург
Re: Помогите, пожалуйста, составить запрос на Python/VB
Вы мне в общем целую вселенную открыли. Постоянно приходится геокодировать адреса, и часто они занесены как попало и не в едином формате. А в чем можно сделать нечто похожее с эксель таблицей?
-
- Завсегдатай
- Сообщения: 388
- Зарегистрирован: 09 ноя 2012, 09:25
- Репутация: 113
- Откуда: Москва
-
- Гуру
- Сообщения: 731
- Зарегистрирован: 12 янв 2011, 22:40
- Репутация: 304
- Ваше звание: ∀
Re: Помогите, пожалуйста, составить запрос на Python/VB
В LibreOffice ещё проще.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость