Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将地址与地址列表进行比较_C#_Sql_Sql Server_Visual Studio 2010_Dll - Fatal编程技术网

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

C# 将地址与地址列表进行比较,c#,sql,sql-server,visual-studio-2010,dll,C#,Sql,Sql Server,Visual Studio 2010,Dll,根据我们的SQL DB地址列表检查客户地址,告知我们的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#,运行应用程序的服务器没有internet连接。 附加示例:- APARTMENT APT APARTMENT

根据我们的SQL DB地址列表检查客户地址,告知我们的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#,运行应用程序的服务器没有internet连接。 附加示例:-

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

有很多选择,如果您有SSI,您可以使用其内置的模糊匹配,这是非常充分的

我使用了环境概念中的一个工具: 它是一个函数集合,将解析和标准化您的地址。他们似乎提供免费试用,这样你就可以进行测试了


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

我会选择像

  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);
            }
公共静态字符串替换(字符串s)
{
var abbrevs=新字典();
缩写添加(“OFC”、“办公室”);
缩写添加(“街”、“街”);
缩写添加(“街”);
如果(abbrevs.ContainsKey(s))返回abbrevs[s];
返回替代品编号或数量;
}
公共静态字符串格式(字符串地址)
{
返回地址.Split(“”).ToList().Select(Substitute).Aggregate((x,y)=>x+“”+y);
}

然后在比较之前转换所有地址,在直接SQL中甚至无法接近成功。即使是在“正常”的编程语言中,这也很困难。有一些地区的称呼风格需要考虑,人们会想出很多称呼变体,比如

  • 主大街123号,3A公寓
  • 第三大街123号
  • 123号主街3号包厢
所有这些都反映了相同的物理地址

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

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

您要做的是在将地址记录到数据库中之前使用。还有一些证据表明,美国药典已经对准确度进行了认证


我曾为一家使用谷歌地图API标准化地址的初创公司工作过一段时间,这是另一种方法。

请提供一些代码!(欢迎来到stackoverflow:))您可以使用levenshtein距离来计算相似性。这里有一个实现:您必须进行模糊匹配。对基本系统使用
包含
开始
结束
。对于一个功能齐全的系统。莱文施泰因不会发现W和西方有太多相似之处。@HenkHolterman:我认为这是一列“地址”。因此,
8455 W第23街第4办公室
8455西第23街OFC第4办公室
之间可能有相似之处,虽然不多。我想你会将所有基于“圣人某物”的街道/地名改为“街道某物”,即当ContainsKey有“圣人”时,它将与“圣人”或“圣人”不匹配。我的意思是“圣尼古拉斯5”和“圣人”“5 st Nicolas”可能是同一地址的一部分。您的代码如何处理?如果这是Saint的有效缩写,则不会。它假设没有缩写用于表示不同的内容。我认为现实世界中的地址不会遵守该假设。请参阅我关于排序/长格式的行。将
“Saint John street”
转换为
”st John st“
可能会更好。我没有时间编写所有案例。我喜欢地址分析器。这里还有免费的源代码:-。谢谢!