Страница 1 из 2
Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 16 фев 2016, 18:14
amnesiac
Подскажите, можно ли извлечь из строки с адресом название улицы с помощью запроса? Или где почитать можно?
Примеры такие
"г.Санкт-Петербург, Бухарестская улица, дом 1, литера А" - нужно вытащить название улицы (например, от "г. Санкт-Петербург, " до "дом")
"г. Санкт-Петербург, город Петергоф, Суворовская улица, дом 3, корпус 11, литера А" - нужно вытащить также название улицы и дополнительно "город Петергоф"
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 16 фев 2016, 19:11
Sasfeat
Как у вас данные принимаются? Просто строка приходит? Последовательность стандартная? слово "улица" всегда указывается?
[ Сообщение с мобильного устройства ]
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 16 фев 2016, 19:19
amnesiac
Я работаю через интерфейс Arcmap, слово улица - не всегда, иногда - проспект, бульвар и т. д.
Но всегда перед геонимом стоит г. Санкт-Петербург или г. Санкт-Петербург, город Зеленогорск (например).
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 16 фев 2016, 19:27
giser
Понимаю, что это жесточайший костыль, но я не программист, извините)
У Вас может оказаться множество разных тонкостей в данных, но на конкретных примерах сработало. По крайней мере, надеюсь, навести Вас на какие-то мысли.
1. #поле с адресом# = Replace([#поле с адресом#], "г.С", "г. С")
2. #поле для улицы# = Mid([#поле с адресом#],21)
3. #какое-то вспомогательное поле целочисленного типа# = InStr([#поле для улицы#], ", дом")
4. #поле для улицы# = Left([#поле для улицы#], [#какое-то вспомогательное поле целочисленного типа#]-1)
*Для калькулятора поля в ArcGIS.
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 17 фев 2016, 10:12
amnesiac
Спасибо, сейчас попробую!
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 17 фев 2016, 13:58
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 на шейп-файле — вроде работает. На других версиях надо проверять: там, помнится, были какие-то проблемы с юникодом в калькуляторе полей.
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 13:50
amnesiac
Круто, супер-круто! Все работает!!! В общем, ура.
Не подскажете ли, с чего следует начать, чтобы научиться так же? Достаточно ли такого будет изучить
https://docs.python.org/2/reference/index.html или это делается с каким-то другим уровнем знания программирования?
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 14:15
Ariki
Достаточно. Это базовые структуры данных Python и функции работы со строками. Я сам, по-моему, ни одной книжки по Python до конца не прочёл, а вот справкой пользуюсь постоянно. А опыт приходит в процессе работы, иначе никак.
Единственное, в Language Reference синтаксис изложен чересчур формально, для практического использования лучше вот это:
https://docs.python.org/2/tutorial/index.html
На самом деле, не обязательно писать всё в одно выражение, можно определить функцию, используя более привычный императивный стиль, и вызывать её. В данном случае я разбиваю исходную строку на список элементов (в строке они разделены запятой), удаляю лишние пробелы в начале и конце (чтобы они не попали в результат), каждый элемент разбиваю на множество слов и фильтрую список элементов в зависимости от того, пересекается ли это множество с известным множеством. Отфильтрованный список вновь склеивается в строку через запятую (хотя, как правило, в нём всего один элемент). Ну ещё вставлено условие для проверки на пустые значения.
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 14:21
trir
а ещё можно использовать
RegEx
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 14:34
giser
del
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 14:36
amnesiac
Спасибо большое за рекомендации. Я правильно понимаю, что для использования регулярных выражений все равно нужно знать синтаксис какого-нибудь языка?
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 15:14
Ariki
Для использования регулярных выражений в Python нужно всего лишь импортировать модуль re и вызывать его функции. Но во многих случаях синтаксис Python читабельнее, и отлаживать его проще. Регулярки хороши там, где нужны стандартные действия со строками (выделение подстроки, разбиение, подстановка) с использованием довольно сложных шаблонов поиска. Однако для более сложных задач синтаксического разбора их возможностей вновь становится недостаточно. Знать и уметь применять регулярные выражения, конечно, надо, они часто выручают, особенно при обработке грязных и плохо структурированных данных.
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 15:34
amnesiac
Вы мне в общем целую вселенную открыли. Постоянно приходится геокодировать адреса, и часто они занесены как попало и не в едином формате. А в чем можно сделать нечто похожее с эксель таблицей?
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 15:47
giser
Re: Помогите, пожалуйста, составить запрос на Python/VB
Добавлено: 18 фев 2016, 15:54
Ariki