我有一列由地址组成,如下所示。
地址
- 1 里德街,曼彻斯特,M1 2DF
- 12 自治市镇路,伦敦,E12,2FH
- 15 琼斯街,纽卡斯尔,泰恩威尔郡,NE1 3DN
等等……等等……
我想将其拆分为不同的列以导入我的 SQL 数据库。我一直在尝试使用 Findstring 以逗号分隔,但是当某些地址的“部分”比其他地址多时遇到了麻烦。有什么想法最好的方法是什么?
非常感谢
这是一个需求规范问题,而不是一个实现问题。您对地址格式的假设越多,您就能进行越详细的解析;同一枚硬币的另一面是,您对地址结构的假设越少,您被指责的错误解析就越少。
确定您是否只需要处理英国邮政电子邮件,或者是否可能出现全球地址,这一点至关重要。
根据您的示例,地址的某些部分似乎始终存在,但请检查此资源以确定所有英国电子邮件地址是否真的需要它们。
如果你发现你需要的解析深度和你可以安全地做出的假设之间的匹配,你应该能够通过逗号索引(FINDSTRING
)继续解析;确定一些从字符串左侧开始的组件,以及一些从字符串右侧开始的组件;并将所有剩余的部分保留为未解析的主体。
您也可能会发现您当前的任务是一项不可能完成的任务,尤其是与国际邮政地址有关的任务。这就是为什么大多数网站和其他数据收集器要求用户以已经解析的形式输入邮政地址。
Hanika提出的优秀点。您的一些解析将取决于您的目标目的地的样子。作为一个无知的 yank,基于 Hanika 的链接,我认为你的输出看起来像
总体思路是,对于流经的每一行,您都希望尽最大努力将数据解析到这些存储桶中。使其“正确”的最佳解决方案是更改数据输入方法以验证并将数据捕获到这些离散桶中。由于最优永远不会发生,因此您的任务是整理渣滓以找到您的黄金。
虽然您可以使用 FINDSTRING 编写一些出色的表达式,但在这种情况下我建议您不要这样做,因为仅维护就会让您发疯。相反,添加一个脚本转换并在 .NET(vb 或 c#)中构建您的解析逻辑。然后将有一个循环通过您的转换运行数据并让某人关注结果。如果你发现了一个新的场景,你就回去调整你的业务规则。它很丑陋,它是迭代的,而且很容易产生人类不会有的结果。
滚动地址标准化逻辑的替代方案