我们正在开发一个导入的 C# 应用程序 地址数据 进入 CRM 系统。CSV 文件包含一个地址列,如“Somethingstreet 34”。然而,我们的 CRM 使用两个 街道名称和门牌号的不同字段. 。当然,在给定的示例中这不会造成任何问题。但我们的荷兰地址系统可能有点麻烦。

现实世界的例子:

  • Somestreet 88a(其中“Somestreet”是街道名称,88a 是门牌号)
  • 2e van Blankenburgstraat 123a(其中“2e van Blankenburgstraat”是街道名称,“123a”是门牌号)
  • 2e van Blankenburgstraat 123-a(其中“2e van Blankenburgstraat”是街道名称,“123-a”是门牌号码)
  • 2e van Blankenburgstraat 123 a(其中“2e van Blankenburgstraat”是街道名称,“123 a”是门牌号码)

现在我正在寻找一个很好的函数(RegEx 或其他函数)来将这些地址行正确地分成两个字段。有没有一种干净的方法可以做到这一点?


编辑:

我对我们的寻址系统做了一些进一步的调查,看来(感谢政府)上述例子甚至不是“最糟糕”的例子。

更多(这些是真实的街道和数字):

  • Rivium 1e Straat 53/ET6(其中“Rivium 1e Straat”是街道,“53/ET6”是门牌号码)
  • Plein 1940-1945 34(其中“Plein 1940-1945”是街道,“34”是门牌号)
  • Apollo 11-Laan 11(其中“Apollo 11-Laan”是街道,“11”(第二个)是门牌号)
  • Charta 77 Vaart 159 3H(其中“Charta 77 Vaart”是街道名称,“159 3H”是门牌号码)
  • Charta 77 Vaart 44/2(其中“Charta 77 Vaart”是街道名称,“44/2”是门牌号)
有帮助吗?

解决方案

数据正确性的最佳解决方案是将现有数据库与已知地址 API 进行比较,该 API 具有为您执行此操作的功能。否则,您只是给出了最好的猜测,并且应该手动检查一些(如果不是全部)数据。

其他提示

我所做的,但我怀疑它是最有效的解决方案是反转地址,然后获取第一部分,直到找到一个数字并将它们全部取出。IE。正则表达式 .*\d+ 在反向地址上。当街道包含数字时,这可以解决您的问题。

您可以做一些事情,在空格上进行分割,然后检查某个内部字符串的第一个字符是否是整数?

喜欢

 char[] splits = new char[1];
 splits[0] = ' ';
 string[] split = addressLine.split(splits);
 int splitLoc = -1, i;
 for (i =1; i < split.Length; i++){//start at 1 to avoid the first '2e' streets
     int theFirstDigit = -1;
     try{
        theFirstDigit = int.Parse(split[i].Substring(0,1));
     }catch {
        //ignore; parse fails with an exception
     }
     if (theFirstDigit != -1){
         splitLoc = i;
         break;
     }
 }
 if (splitLoc < 0) return; //busted
 string field1, field2;
 for (i = 0; i < splitLoc; i++){
     field1+= split[i] + " ";
 }

 for (i = splitLoc; i < split.Length; i++){
     field2+= split[i] + " ";
 }

取决于您所说的“干净”的含义,但如果所有地址都可以按照您指定的方式形成,那么看起来确实可行。

人们可以通过多种不同的方式输入这些数据。我经常把我的地址写成:

123 富街 3 号公寓

即街道名称两端都有房屋和公寓号码

如果这是我的问题,我会编写一个正则表达式来处理“简单”的问题并标记复杂的问题以供人工审查。

您可以从人口普查局找到美国街道名称列表,但它被埋在一个巨大的数据文件中

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top