31

我正在寻找一个很好的工具,它可以获取完整的邮寄地址,格式化为显示或与邮寄标签一起使用,并将其转换为结构化对象。

例如:

// Start with a formatted address in a single string
string f = "18698 E. Main Street\r\nBig Town, AZ, 86011";

// Parse into address
Address addr = new Address(f);

addr.Street; // 18698 E. Main Street
addr.Locality; // Big Town
addr.Region; // AZ
addr.PostalCode; // 86011

现在我可以使用 RegEx 来做到这一点。但棘手的部分是让它足够通用以处理世界上的任何地址!

我相信肯定有什么东西可以做到。

如果有人注意到,这实际上是opensocial.address对象的格式。

4

7 回答 7

24

Googlemaps API 对此非常有效。例如,假设给定字符串“120 w 45 st nyc”。像这样将它传递给 Googlemaps API:http://maps.google.com/maps/geo?q=120+w+45+st+nyc你会得到这个响应:

{
  "name": "120 w 45 st nyc",
  "Status": {
    "code": 200,
    "request": "geocode"
  },
  "Placemark": [ {
    "id": "p1",
    "address": "120 W 45th St, New York, NY 10036, USA",
    "AddressDetails": {"Country": {"CountryNameCode": "US","CountryName": "USA","AdministrativeArea": {"AdministrativeAreaName": "NY","Locality": {"LocalityName": "New York","Thoroughfare":{"ThoroughfareName": "120 W 45th St"},"PostalCode": {"PostalCodeNumber": "10036"}}}},"Accuracy": 8},
    "ExtendedData": {
      "LatLonBox": {
        "north": 40.7603883,
        "south": 40.7540931,
        "east": -73.9807141,
        "west": -73.9870093
      }
    },
    "Point": {
      "coordinates": [ -73.9838617, 40.7572407, 0 ]
    }
  } ]
}
于 2009-05-05T20:08:11.313 回答
7

如果您正在寻找具有简单解决方案的地址解析器,请尝试以下操作:

http://usaddress.codeplex.com/

好:1. 不需要数据库 2. 不需要互联网查找 3. 非常准确

Bad: 1. 无法确认是否为真实地址 2. 仅适用于美国地址 3. 在C#中,使用.NET 3.5 或以上

于 2012-03-08T17:17:11.830 回答
5

如前所述,这不是一个小问题。除了国际地址之外,最大的问题之一是地址没有标准格式,而且地址无法告诉您它是否格式正确,即它不像信用卡号码那样自我验证.

因此,您必须依靠外部事实来源来确保地址是真实的。这就是地址验证服务发挥作用的地方。根据您的业务需求和应用程序要求,您可能正在查看一次性“批量”清理您的地址列表,或者可能是实时/实时地址验证服务。有许多优秀的供应商(成本各不相同)可以轻松解决这个问题。

我应该提一下,我是 SmartyStreets 的创始人。我们进行CASS 认证的地址验证。我们会将您的未格式化/原始地址转换为经过清理、标准化和验证/确认的地址。根据您列表的大小,成本通常只有几美元,而且周转时间几乎是即时的——通常是几分钟。

于 2011-10-13T03:57:50.197 回答
4

您可以尝试Experian 地址验证。有它的问题,但几乎像宣传的那样有效。

于 2009-02-05T22:56:18.567 回答
3

由于没有像@duffymo 说的那样简单的解决方案,接下来最好的事情可能是重新考虑设计。如果是用户表单,妥协让用户填写。如果您要追溯解析数据,请使用非常严格的正则表达式根据某些标准(国家/地区为美国)解析地址。然后在剩下的那些上做第二遍,依此类推。我采用了这种方法,这是唯一可靠的方法。

采用通用正则表达式方法的另一个设计问题是它会为错误的地址生成误报。如果您向这些人发送蜗牛邮件,它最终会被退回,您将有更多的工作要做,试图找出哪些邮件返回或继续将邮件发送到错误的地址。

于 2009-02-05T23:23:18.573 回答
3

我最近尝试了 RecogniContact。它是一个解析美国和欧洲地址的 Windows COM 组件。您可以从网站上对其进行测试。

http://www.loquisoft.com/index.php?page=8

于 2009-05-12T13:50:12.077 回答
0

对于加拿大地址,我使用了一个名为Street Perfect的地址。我们必须将c++代码封装在一些代码中.net以使其可重用于我们的目的,但这相当容易。

于 2011-02-01T07:07:55.447 回答