2011-02-14 77 views
0

我在MySQL中有一個地址字符串,它已經從源代碼中混合在一起。我認爲可以使用正則表達式或其他方法將字符串分離爲可用的MySQL部分,但我不知道如何實現這一點。如何在MySQL中混合使用一個地址字符串

基本上每串看起來像這些例子(我添加了一個標記上方顯示的每個位是什麼):

<-------------><-------><-><--> 
123 Fake StreetRESERVOIRVIC3001 
<-----------------><--------------------><------><-><--> 
Brooks Nursing Home123 Little Fake StreetSMITHTONNSW2001 
<-------------------><-------------------><--- ><><--> 
Grange Police StationShop 1 Fairytale LaneGRANGEWA8001 

應該被分成可選的兩個地址信息行地址,郊區,州和郵政編碼。我在澳大利亞,所以州將是新南威爾士州,維多利亞州,昆士蘭州,華盛頓州,南澳大利亞州,新界,或者ACT,並且郵政編碼最後總是4位數字。

可能的解決方法是,郊區將始終爲大寫字母,狀態和郵政編碼在最後6或7個字符內(取決於狀態)是可預測的,前兩行地址信息將被打破在沒有空間特徵的情況下改變。

我有這樣的100,000條記錄,所以要通過手工完成它將是非常耗時的。任何幫助以這種方式進行編程將非常感激。

+1

當有人提出「123 McDonald's Way?」會發生什麼?情況有所改變,不是地址部分邊界。 – 2011-02-14 02:28:23

+1

我會用你最喜歡的腳本語言標記,像perl,python,sed和awk而不是mysql來重寫這個。分隔前兩個字段會遇到實際問題。編程語言將是更好的方法來解決這個問題。 – 2011-02-14 04:04:11

回答

1

沒有空格?大多數毛病...

MySQL沒有處理這個問題的工具,因此您必須使用外部程序訪問數據庫。我傾向於使用Perl來處理這種情況。

從結尾開始並向後倒退...我們知道最後四位應該是數字,並且前面的7個選項之一的前面的字母。使用這些知識,你會下降2場和6-7個字符。

它看起來像你的例子現在有一個鎮在所有大寫字母在結束...解析出來,它應該匹配的狀態和區號。我敢肯定,你可以在幾分鐘內在網上找到一個郵政編碼數據庫。

剩下的名字和街道地址,會有一些變化,我希望你有一點運氣。你可以在小寫字母和大寫字母之間沒有空格的情況下,或者以字母和數字作爲突破點,從而開始起步。

0

接受挑戰。我甚至會拋出一些基本的標點符號以允許「101聖馬克聖地」等等。

/^(([\w\'\.](?=[a-z \'\.])|)+[a-z\'\.])?(([\w\'\.](?=[a-z \d\'\.])|)+[a-z\.\'])([A-Z]+)(NSW|VIC|QLD|WA|SA|NT|ACT)(\d{4})/ 

很可能使用多一點的清理,但它應該在支持與前瞻基本的正則表達式的任何語言工作(一些實現,比如JavaScript的和(我認爲)Ruby的,支持先行,而不是回顧後) 。 (那個,這個難題讓我在睡覺的時候好起來。)至少,它對你提供的三個例子有效。

順便說一句,2problems.com是一個很好的網站,用於快速測試正則表達式。這是我用來解決這個難題的東西。建立它的人肯定是一個真正的天才。 (koff koff)

Rubular是另一個不錯的選擇,雖然它是通過在幕後對Ajax調用Ruby腳本來工作的,但它有點慢。儘管如此,它具有能夠鏈接到輸入模式和乾草堆的優點。 here's this pattern on Rubular。這個問題的傢伙真的應該得到解決方案來完成某些事情。

相關問題