将地址行分成两个字段的最佳方法
-
21-08-2019 - |
题
我们正在开发一个导入的 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 号公寓
即街道名称两端都有房屋和公寓号码
如果这是我的问题,我会编写一个正则表达式来处理“简单”的问题并标记复杂的问题以供人工审查。
不隶属于 StackOverflow