주소 라인을 두 필드로 나누는 가장 좋은 방법
-
21-08-2019 - |
문제
우리는 가져 오는 AC# 응용 프로그램을 개발하고 있습니다 주소 데이터 CRM 시스템으로. CSV 파일에는 'SomethingsTreet 34'와 같은 주소 열이 포함되어 있습니다. 그러나 우리의 CRM은 두 가지를 사용합니다 거리 이름과 HouseNumber의 다른 필드. 물론, 주어진 예에서 이것은 문제가되지 않습니다. 그러나 우리의 네덜란드 주소 시스템은 약간의 고통이 될 수 있습니다.
실제 예 :
- Somestreet 88a (여기서 'Somestreet'은 거리 이름이고 88a는 HouseNumber)
- 2e van blankenburgstraat 123a (여기서 '2e van blankenburgrstraat'는 거리 이름이고 '123a'는 housenumber)
- 2e van blankenburgstraat 123-a (여기서 '2e van blankenburgrstraat'는 거리 이름이고 '123-a'는 houseenumber)
- 2e van blankenburgstraat 123 a (여기서 '2e van blankenburgrstraat'는 거리 이름이고 '123 a'는 housenumber)
이제 저는이 주소 라인을 두 개의 필드로 올바르게 분할하는 멋진 기능 (Regex 또는 Something)을 찾고 있습니다. 이 작업을 수행하는 멋진 깨끗한 방법이 있습니까?
편집하다:
나는 우리의 주소 지정 시스템에 대해 몇 가지 조사를했으며 위의 사례는 '최악의'사례가 아닌 것으로 보입니다 (정부 감사).
더 많은 (이것은 실제 거리와 숫자입니다) :
- Rivium 1e Straat 53/et6 (여기서 'Rivium 1e Straat'는 거리이고 '53/et6 '은 HouseNumber입니다)
- Plein 1940-1945 34 (여기서 'Plein 1940-1945'는 거리이고 '34'는 HouseNumber입니다)
- Apollo 11-Laan 11 (여기서 'Apollo 11-Laan'은 거리이고 '11'(두 번째는 HouseNumber)입니다)
- Charta 77 Vaart 159 3H (여기서 'Charta 77 Vaart'는 거리 이름이고 '159 3H'는 HouseNumber)
- Charta 77 Vaart 44/2 (여기서 'Charta 77 Vaart'는 거리 이름이고 '44/2 '는 HouseNumber)
해결책
데이터 정확성을위한 최상의 솔루션은 기존 데이터베이스를 알려진 주소 API와 비교하는 것입니다. 그렇지 않으면 최선의 추측을 제공하고 일부는 아니지만 일부는 수동으로 검토되어야합니다.
다른 팁
내가 한 일이지만, 그것이 가장 성능이 좋은 해결책은 주소를 뒤집고 숫자를 찾아서 모두 가져갈 때까지 첫 번째 부분을 얻는 것입니다. 즉, 성과선 .*\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 Foo Street apt#3
즉 거리 이름의 양쪽 끝에 집과 아파트 번호가있는
이것이 나의 문제라면 나는 "쉬운"것을 처리하고 복잡한 사람을 인간 검토를 위해 깃발로하는 정규식을 작성할 것입니다.