2013-05-12 42 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

爲什麼要這樣拒絕:'shop 5 Big Shopping Center'? – 2013-05-12 15:47:22

+0

@kaᵠ-因爲它不是一個有效的澳大利亞地址,根據任務 – dhssa 2013-05-12 16:03:03

+0

的規格,郵局ville返回/拒絕交付,但是程序實際上並不理解*數據,您需要教他們不知何故。什麼會使這被拒絕? – 2013-05-12 16:13:34

回答

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 2013-05-12 14:55:07

+0

@DilshatAbduwalli - 請將您正在談論的地址添加到您的問題並給出所需的輸出。 – 2013-05-12 14:58:00

+0

@Skritunoff - 問題根據以上評論編輯 – dhssa 2013-05-12 15:05:51

3

我假定你已經看到了答案,這樣question沿着相同的路線。

@kaᵠ已經指出該程序對數據一無所知,因此它沒有上下文。情況總是如此。因此,考慮到這一點,您需要確定的第一件事是您需要什麼級別的準確度?如果你需要70%的準確度,那麼你可以用簡單的REGEX做到這一點。 (是正則表達式非常簡單)?

如果您需要確定從輸入中提取的地址實際上是否真實有效,則需要使用列表或表格進行比較。這些數據將來自澳大利亞郵政(或美國的USPS)等來源。

因此,使用您的正則表達式來提取「猜測」,然後驗證那些對照主列表和匹配的是好的。沒有主列表,你不能確定你是否正確或錯誤。

我實際上一直在研究這個完全相同的問題在SmartyStreets(除了我只處理美國的addreses),並提出了許多不同的解決方案 - 不同的方式來確定地址字符串的開始和結束,作爲以及如何處理誤報,或者看起來像郵政編碼的主要數字。你可以去純粹的REGEX,或者你也可以使用包含郵政編碼,州和街道名稱的表格。這使您能夠非常接近地以高精度提取原子數據。