我在MySQL中有一个地址字符串,它已从源代码中混合在一起。我认为可以使用正则表达式或其他方法将字符串分隔成MySQL中的可用部分,但我不知道如何实现这一点。
基本上每个字符串看起来都像这些例子(我在顶部添加了一个标记来显示每个位是什么):
<-------------><-------><-><-->
123 Fake StreetRESERVOIRVIC3001
<-----------------><--------------------><------><-><-->
Brooks Nursing Home123 Little Fake StreetSMITHTONNSW2001
<-------------------><-------------------><--- ><><-->
Grange Police StationShop 1 Fairytale LaneGRANGEWA8001
该地址应该分为两行地址信息,郊区,州和邮政编码。我在澳大利亚所以该州将是新南威尔士州,维多利亚州,QLD,WA,SA,NT或ACT,邮政编码最终将是一个4位数字。
分解的可能方法是郊区将始终大写,状态和邮政编码可在最后6或7个字符内预测(取决于状态),前两行地址信息将被分解通过改变,两者之间没有空格字符。
我有大约10万张这样的记录,所以要手工完成并非常费时。任何有关以编程方式执行此操作的帮助都将非常感激。
答案 0 :(得分:1)
没有空格?最粗略的......
MySQL没有处理这个的工具,所以你必须使用外部程序访问数据库。我倾向于使用Perl进行这样的操作。
从结尾开始并向后工作......我们知道最后四个应该是数字,并且在7个选项之一之前的字母。使用这些知识,你将在2个字段和6-7个字符。
看起来你的例子现在有一个全部大写字母的小镇......解析它,它应该与州和区号相匹配。我确信你可以在几分钟内找到一个邮政编码数据库。
随着名称和街道地址的剩余,这将有一些变化,我希望你有点运气。你可能有一个良好的开端,能够专注于小写和大写之间缺少空格,或者以字母和数字作为断点。
答案 1 :(得分:0)
接受挑战。我甚至会用一些基本的标点符号来容纳“101 St. Mark's St.”等等。
/^(([\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是另一个不错的选择,但是因为它通过在场景后对Ruby脚本进行Ajax调用来工作,所以它有点慢。它确实具有能够链接到输入的模式和干草堆的很好的功能; here's this pattern on Rubular。有一天,2个问题的人真的应该去实现这样的事情。