2013-05-12 3 views
1

Моя задача - превратить неатомические (австралийские) уличные адреса в атомы, что означает, что текущие уличные данные хранятся как номер улицы и названия улиц вместе. Образцы:Как разделить значения улиц на атомарные в pl/sql?

24 George street  -----------> 24   | George street  
55 park rd    -----------> 55   | pard rd 
102a gordon road  -----------> 102a  | gordon road 
unit 5/46 addison ave -----------> unit 5/46 | addison ave 
flat 2-9/87 north avenue-----------> flat 2-9/87| north avenue 
suit 5 lvl2/55 prince hwy-------> suit 5 lvl2/55| prince hwy 
shop 5 Big Shopping Centre ------> Rejected 
Suit 2 Level 100   -------> Rejected 

добавлены данные (то, как программа должна работать):

Darling street ------------------> Rejected 
City road -----------------------> rejected 

предложенный код обработанный результат:

Darling street ------------> Darling  | Street 
City road ---------------> City  |  road 

на самом деле в этом случае код не должен процесс адрес и исключение.

Каков наилучший способ разделения адресов?

+0

Почему это должно быть отклонено: «Магазин 5 Большой торговый центр»? –

+0

@ kaᵠ- потому что это не действительный австралийский адрес, который почта ville возвращает/отклоняет поставку, в соответствии с спецификациями задачи – dhssa

+0

Я получил это, но программы на самом деле не понимают * данные, вам нужно их учить как-то. Что бы от этого отказало? –

ответ

2
select 
    addr, 
    regexp_substr(addr, '^(.*?)\s\D+$', 1, 1, '', 1) street_number, 
    regexp_substr(addr, '^.*?\s+(\D*?)\s*$', 1, 1, '', 1) street_name 
from t1 
where -- don't show rejected 
    regexp_like(addr, '\d.*\s(street|road|rd|ave|avenue|hwy)\s*$', 'i') 

fiddle

+0

работает хорошо, но что делать, если на улицах нет номера. Теперь я беру название улицы в качестве номера улицы, если номер улицы не был записан, есть ли способ предотвратить его обработку, если нет номера? – dhssa

+0

@DilshatAbduwalli - Пожалуйста, добавьте адрес, о котором вы говорите, и укажите желаемый результат. –

+0

@Skritunoff - вопрос был отредактирован в соответствии с комментарием выше – dhssa

3

Я предполагаю, что вы уже видели ответы на этот question по той же схеме.

@ kaᵠ указал, что программа ничего не знает о данных, поэтому у нее нет контекста. Это всегда будет так. Итак, имея в виду это, первое, что вам нужно определить, какой уровень точности вам нужен? Если вам нужна точность 70%, вы можете сделать это с помощью простого REGEX. (Является ли regex EVER действительно простым)?

Если вам нужна уверенность в том, что адреса, которые вы извлекли из ввода, действительно реальны и действительны, вам нужен список или таблица для сравнения. Эти данные поступают от источника, такого как Australia Post (или USPS в Соединенных Штатах).

Итак, используйте ваше регулярное выражение для извлечения «догадок», а затем проверьте их на главный список, и те, которые соответствуют друг другу, хороши. Без главного списка вы не можете быть уверены, что получили правильное решение, или что вы ошиблись.

Я действительно работал над этой же проблемой на SmartyStreets (кроме случаев, когда я занимаюсь только с помощью US addreses), и разработал ряд различных решений - различные способы определения начала и конца адресной строки, так как а также как обрабатывать ложные срабатывания или первичные номера, которые выглядят точно так же, как почтовый код. Вы можете перейти на чистый REGEX или использовать таблицы, содержащие почтовые коды, состояния, а также названия улиц. Это дает вам возможность приблизиться к тому, чтобы с высокой точностью извлекать атомные данные.

 Смежные вопросы

  • Нет связанных вопросов^_^