将地址与地址列表进行比较

时间:2013-06-13 21:57:50

标签: c# sql sql-server visual-studio-2010 dll

要根据我们的SQL DB地址列表检查客户地址,请告知我们的数据库中是否存在该地址。 客户地址有不同的格式。

e.g:- 8455 W 23RD st OFFICE 4
     8455 WEST 23RD st OFC 4
     8455 WEST TWENTY-THIRD street OFC 4

如果我进行字符串比较,我会得到bExist = False;

注意: - 我正在使用C#,服务器运行的应用程序没有互联网连接。 例如: -

APARTMENT   APT
APARTMENT   APARTMENT
BUILDING    BLDG
BUILDING    BUILDING
DEPARTMENT  DEPT
DEPARTMENT  DEPARTMENT
FLOOR   FL
FLOOR   FLOOR
HANGAR  HNGR
HANGAR  HANGAR
LOT LOT
OFFICE  OFC
OFFICE  OFFICE
PIER    PIER
PIER    PIER
ROOM    RM
ROOM    ROOM
SLIP    SLIP
SPACE   SPC
SPACE   SPACE
STOP    STOP
SUITE   STE
SUITE   SUITE
TRAILER TRLR
TRAILER TRAILER
UNIT    UNIT

N   NORTH
S   SOUTH
E   EAST
W   WEST
NE  NORTHEAST
SE  SOUTHEAST
NW  NORTHWEST
SW  SOUTHWEST
NORTH   NORTH
SOUTH   SOUTH
EAST    EAST
WEST    WEST
NORTHEAST   NORTHEAST
SOUTHEAST   SOUTHEAST
NORTHWEST   NORTHWEST
SOUTHWEST   SOUTHWEST
NORTH EAST  NORTHEAST
SOUTH EAST  SOUTHEAST
NORTH WEST  NORTHWEST
SOUTH WEST  SOUTHWEST

3 个答案:

答案 0 :(得分:1)

有很多选项,如果你有SSIS,你可以使用他们内置的模糊匹配,这是非常合适的。

我使用了Ambient Concepts的工具:Address Parser 它是一组函数,可以解析和标准化您的地址。他们似乎提供免费试用,所以你可以测试它。

您也可以从头开始,尽可能均匀化数据。我们经常将街道号码和街道名称分开,因为绝大多数差异来自前/后方向,即:12北5号,12号5号,12号北5号等。以及数字与数字 - 字数。

答案 1 :(得分:1)

你甚至无法在直接SQL中取得成功。即使是在“普通”编程语言中也很难。需要考虑区域寻址方式,以及人们提出的许多地址变体,例如

  • 123 Main St,Apt 3A,...
  • 123 Main St#3,...
  • 123 Main St Box 3 ...

所有这些都反映了相同的物理地址。

这甚至没有考虑简单的数据输入错误,例如转置字符。

事情很快变得非常困难。你将花费大量的时间和精力来处理下一个创造性数据输入错误。

您要做的是在录制数据库中的地址之前使用US Post Office's address standardization services。 USPS还证明了quite a few 3rd party vendors的准确性。

我曾在一家创业公司工作过一段时间,使用Google Maps API来标准化地址 - 另一种方法。

答案 2 :(得分:0)

我会选择类似......

  public static string Substitute(string s)
            {
                var abbrevs = new Dictionary<string, string>();
                abbrevs.Add("OFC", "OFFICE");
                abbrevs.Add("ST", "STREET");
                abbrevs.Add("ST.", "STREET");
                if (abbrevs.ContainsKey(s)) return abbrevs[s];
                return SubstituteWordNumbersForNumerics(s);            
            }

            public static string ToNormalAddressFormat(string address)
            {
                return address.Split(' ').ToList().Select(Substitute).Aggregate((x, y) => x + " " + y);
            }

然后在比较之前转换所有地址