Помогите, пожалуйста, составить запрос на Python/VB

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Подскажите, можно ли извлечь из строки с адресом название улицы с помощью запроса? Или где почитать можно?
Примеры такие
"г.Санкт-Петербург, Бухарестская улица, дом 1, литера А" - нужно вытащить название улицы (например, от "г. Санкт-Петербург, " до "дом")

"г. Санкт-Петербург, город Петергоф, Суворовская улица, дом 3, корпус 11, литера А" - нужно вытащить также название улицы и дополнительно "город Петергоф"
Аватара пользователя
Sasfeat
Интересующийся
Сообщения: 36
Зарегистрирован: 20 фев 2013, 18:18
Репутация: 13
Откуда: Ухань
Контактная информация:

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение Sasfeat »

Как у вас данные принимаются? Просто строка приходит? Последовательность стандартная? слово "улица" всегда указывается?

[ Сообщение с мобильного устройства ]
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Я работаю через интерфейс Arcmap, слово улица - не всегда, иногда - проспект, бульвар и т. д.
Но всегда перед геонимом стоит г. Санкт-Петербург или г. Санкт-Петербург, город Зеленогорск (например).
giser
Завсегдатай
Сообщения: 388
Зарегистрирован: 09 ноя 2012, 09:25
Репутация: 113
Откуда: Москва

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение giser »

Понимаю, что это жесточайший костыль, но я не программист, извините)
У Вас может оказаться множество разных тонкостей в данных, но на конкретных примерах сработало. По крайней мере, надеюсь, навести Вас на какие-то мысли.

1. #поле с адресом# = Replace([#поле с адресом#], "г.С", "г. С")
2. #поле для улицы# = Mid([#поле с адресом#],21)
3. #какое-то вспомогательное поле целочисленного типа# = InStr([#поле для улицы#], ", дом")
4. #поле для улицы# = Left([#поле для улицы#], [#какое-то вспомогательное поле целочисленного типа#]-1)

*Для калькулятора поля в ArcGIS.
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Спасибо, сейчас попробую!
Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение Ariki »

На Python в калькуляторе полей, если не заморачиваться с регулярками, будет как-то так:

Код: Выделить всё


', '.join(
filter(
lambda y: set(y.split()) & { u'улица', u'переулок', u'бульвар' },
(x.strip() for x in !fieldname!.split(','))
)
) if !fieldname! else ''

Здесь !fieldname! — имя вашего поля; в фигурных скобках дано множество токенов, сигнализирующих о том, что элемент адреса является улицей. Предполагается, что элементы адреса разделены запятой.

Протестировал в ArcGIS 10.3 на шейп-файле — вроде работает. На других версиях надо проверять: там, помнится, были какие-то проблемы с юникодом в калькуляторе полей.
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Круто, супер-круто! Все работает!!! В общем, ура.
Не подскажете ли, с чего следует начать, чтобы научиться так же? Достаточно ли такого будет изучить https://docs.python.org/2/reference/index.html или это делается с каким-то другим уровнем знания программирования?
Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение Ariki »

Достаточно. Это базовые структуры данных Python и функции работы со строками. Я сам, по-моему, ни одной книжки по Python до конца не прочёл, а вот справкой пользуюсь постоянно. А опыт приходит в процессе работы, иначе никак.

Единственное, в Language Reference синтаксис изложен чересчур формально, для практического использования лучше вот это:
https://docs.python.org/2/tutorial/index.html

На самом деле, не обязательно писать всё в одно выражение, можно определить функцию, используя более привычный императивный стиль, и вызывать её. В данном случае я разбиваю исходную строку на список элементов (в строке они разделены запятой), удаляю лишние пробелы в начале и конце (чтобы они не попали в результат), каждый элемент разбиваю на множество слов и фильтрую список элементов в зависимости от того, пересекается ли это множество с известным множеством. Отфильтрованный список вновь склеивается в строку через запятую (хотя, как правило, в нём всего один элемент). Ну ещё вставлено условие для проверки на пустые значения.
trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение trir »

а ещё можно использовать RegEx
giser
Завсегдатай
Сообщения: 388
Зарегистрирован: 09 ноя 2012, 09:25
Репутация: 113
Откуда: Москва

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение giser »

del
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Спасибо большое за рекомендации. Я правильно понимаю, что для использования регулярных выражений все равно нужно знать синтаксис какого-нибудь языка?
Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение Ariki »

Для использования регулярных выражений в Python нужно всего лишь импортировать модуль re и вызывать его функции. Но во многих случаях синтаксис Python читабельнее, и отлаживать его проще. Регулярки хороши там, где нужны стандартные действия со строками (выделение подстроки, разбиение, подстановка) с использованием довольно сложных шаблонов поиска. Однако для более сложных задач синтаксического разбора их возможностей вновь становится недостаточно. Знать и уметь применять регулярные выражения, конечно, надо, они часто выручают, особенно при обработке грязных и плохо структурированных данных.
amnesiac
Активный участник
Сообщения: 244
Зарегистрирован: 03 мар 2015, 10:01
Репутация: 24
Откуда: Санкт-Петербург

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение amnesiac »

Вы мне в общем целую вселенную открыли. Постоянно приходится геокодировать адреса, и часто они занесены как попало и не в едином формате. А в чем можно сделать нечто похожее с эксель таблицей?
giser
Завсегдатай
Сообщения: 388
Зарегистрирован: 09 ноя 2012, 09:25
Репутация: 113
Откуда: Москва

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение giser »

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Помогите, пожалуйста, составить запрос на Python/VB

Сообщение Ariki »

В LibreOffice ещё проще.
Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость