문제

우리는 가져 오는 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

즉 거리 이름의 양쪽 끝에 집과 아파트 번호가있는

이것이 나의 문제라면 나는 "쉬운"것을 처리하고 복잡한 사람을 인간 검토를 위해 깃발로하는 정규식을 작성할 것입니다.

인구 조사국에서 미국에서 거리 이름 목록을 찾을 수 있지만 괴물 데이터 파일 안에 묻혀 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top