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

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

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

Сообщение amnesiac » 16 фев 2016, 18:14

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

"г. Санкт-Петербург, город Петергоф, Суворовская улица, дом 3, корпус 11, литера А" - нужно вытащить также название улицы и дополнительно "город Петергоф"

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

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

Сообщение Sasfeat » 16 фев 2016, 19:11

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

[ Сообщение с мобильного устройства ]

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

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

Сообщение amnesiac » 16 фев 2016, 19:19

Я работаю через интерфейс Arcmap, слово улица - не всегда, иногда - проспект, бульвар и т. д.
Но всегда перед геонимом стоит г. Санкт-Петербург или г. Санкт-Петербург, город Зеленогорск (например).

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

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

Сообщение giser » 16 фев 2016, 19:27

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

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

*Для калькулятора поля в ArcGIS.

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

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

Сообщение amnesiac » 17 фев 2016, 10:12

Спасибо, сейчас попробую!

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

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

Сообщение Ariki » 17 фев 2016, 13:58

На 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 » 18 фев 2016, 13:50

Круто, супер-круто! Все работает!!! В общем, ура.
Не подскажете ли, с чего следует начать, чтобы научиться так же? Достаточно ли такого будет изучить https://docs.python.org/2/reference/index.html или это делается с каким-то другим уровнем знания программирования?

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

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

Сообщение Ariki » 18 фев 2016, 14:15

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

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

На самом деле, не обязательно писать всё в одно выражение, можно определить функцию, используя более привычный императивный стиль, и вызывать её. В данном случае я разбиваю исходную строку на список элементов (в строке они разделены запятой), удаляю лишние пробелы в начале и конце (чтобы они не попали в результат), каждый элемент разбиваю на множество слов и фильтрую список элементов в зависимости от того, пересекается ли это множество с известным множеством. Отфильтрованный список вновь склеивается в строку через запятую (хотя, как правило, в нём всего один элемент). Ну ещё вставлено условие для проверки на пустые значения.

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 18 фев 2016, 14:21

а ещё можно использовать RegEx

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

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

Сообщение giser » 18 фев 2016, 14:34

del

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

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

Сообщение amnesiac » 18 фев 2016, 14:36

Спасибо большое за рекомендации. Я правильно понимаю, что для использования регулярных выражений все равно нужно знать синтаксис какого-нибудь языка?

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

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

Сообщение Ariki » 18 фев 2016, 15:14

Для использования регулярных выражений в Python нужно всего лишь импортировать модуль re и вызывать его функции. Но во многих случаях синтаксис Python читабельнее, и отлаживать его проще. Регулярки хороши там, где нужны стандартные действия со строками (выделение подстроки, разбиение, подстановка) с использованием довольно сложных шаблонов поиска. Однако для более сложных задач синтаксического разбора их возможностей вновь становится недостаточно. Знать и уметь применять регулярные выражения, конечно, надо, они часто выручают, особенно при обработке грязных и плохо структурированных данных.

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

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

Сообщение amnesiac » 18 фев 2016, 15:34

Вы мне в общем целую вселенную открыли. Постоянно приходится геокодировать адреса, и часто они занесены как попало и не в едином формате. А в чем можно сделать нечто похожее с эксель таблицей?

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

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

Сообщение giser » 18 фев 2016, 15:47


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

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

Сообщение Ariki » 18 фев 2016, 15:54

В LibreOffice ещё проще.

Ответить

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

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

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