1

我有一列由地址组成,如下所示。

地址

  • 1 里德街,曼彻斯特,M1 2DF
  • 12 自治市镇路,伦敦,E12,2FH
  • 15 琼斯街,纽卡斯尔,泰恩威尔郡,NE1 3DN

等等……等等……

我想将其拆分为不同的列以导入我的 SQL 数据库。我一直在尝试使用 Findstring 以逗号分隔,但是当某些地址的“部分”比其他地址多时遇到了麻烦。有什么想法最好的方法是什么?

非常感谢

4

2 回答 2

1

这是一个需求规范问题,而不是一个实现问题。您对地址格式的假设越多,您就能进行越详细的解析;同一枚硬币的另一面是,您对地址结构的假设越少,您被指责的错误解析就越少。

确定您是否只需要处理英国邮政电子邮件,或者是否可能出现全球地址,这一点至关重要。

根据您的示例,地址的某些部分似乎始终存在,但请检查此资源以确定所有英国电子邮件地址是否真的需要它们。

如果你发现你需要的解析深度和你可以安全地做出的假设之间的匹配,你应该能够通过逗号索引(FINDSTRING)继续解析;确定一些从字符串左侧开始的组件,以及一些从字符串右侧开始的组件;并将所有剩余的部分保留为未解析的主体。

您也可能会发现您当前的任务是一项不可能完成的任务,尤其是与国际邮政地址有关的任务。这就是为什么大多数网站和其他数据收集器要求用户以已经解析的形式输入邮政地址。

于 2012-07-23T09:01:04.653 回答
1

Hanika提出的优秀点。您的一些解析将取决于您的目标目的地的样子。作为一个无知的 yank,基于 Hanika 的链接,我认为你的输出看起来像

  • 收件人
  • 组织
  • 建筑名称
  • 建筑地址
  • 地方性
  • 驿站
  • 邮政编码
  • BasicsMet(布尔值,指示是否满足良好地址 的最低标准。)
    • 在美国,仅仅因为地址无法正确CASS ed 并不意味着它无法交付 - cip,我的祖父母住在足够多的小镇上,指定他们的姓名和城市就足以作为本地交付邮政官员知道他们是谁。但是,对于批量邮寄,他们的地址不符合批量邮寄费率,并且默认为头等邮件。我假设英国邮件也存在类似的情况

总体思路是,对于流经的每一行,您都希望尽最大努力将数据解析到这些存储桶中。使其“正确”的最佳解决方案是更改数据输入方法以验证并将数据捕获到这些离散桶中。由于最优永远不会发生,因此您的任务是整理渣滓以找到您的黄金。

虽然您可以使用 FINDSTRING 编写一些出色的表达式,但在这种情况下我建议您不要这样做,因为仅维护就会让您发疯。相反,添加一个脚本转换并在 .NET(vb 或 c#)中构建您的解析逻辑。然后将有一个循环通过您的转换运行数据并让某人关注结果。如果你发现了一个新的场景,你就回去调整你的业务规则。它很丑陋,它是迭代的,而且很容易产生人类不会有的结果。

滚动地址标准化逻辑的替代方案

  • 买它。最终,您的业务需求超过了您应对不断变化的业务规则的能力。那里有很多供应商,但我只熟悉美国的供应商
  • 升级到 SQL Server 2012 以使用DQS(数据质量服务)。您可能仍然需要购买产品来构建您的知识库,但您可以将业务规则制定任务交给领域专家(“嘿,你一小时赚了花生。确保所有地址都来自这个外观喜欢地址”是他们在我的一项工作开始时如何涵盖这一点的方式)。
于 2012-07-23T15:51:22.570 回答