2011-02-14 240 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。这个问题的家伙真的应该得到解决方案来完成某些事情。

相关问题