Лучший способ разбить адресную строку на два поля - PullRequest
1 голос
/ 29 июня 2009

Мы разрабатываем приложение c #, которое импортирует address-data в 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 123a (где «2e van Blankenburgstraat» - это название улицы, а «123a» - это номер дома)

Теперь я ищу хорошую функцию (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» - номер дома)

Ответы [ 4 ]

1 голос
/ 29 июня 2009

Лучшим решением для правильности данных будет сравнение существующей базы данных с известным адресным API, у которого есть функция, которая сделает это за вас. В противном случае вы просто даете свое предположение, и некоторые, если не все, данные должны быть проверены вручную.

0 голосов
/ 29 июня 2009

Существует слишком много разных способов ввода этих данных. Я часто пишу свой адрес как:

123 Foo Street Apt # 3

т.е. с номерами домов и квартир по обеим сторонам названия улицы

Если бы это была моя проблема, я бы написал регулярное выражение, которое обрабатывает "простые" и помечает сложные для анализа человеком.

Вы можете найти список названий улиц в США в Бюро переписей, но он похоронен в файле данных монстра

0 голосов
/ 29 июня 2009

Можете ли вы сделать что-то, где вы разделяете пробелы, а затем проверить, является ли первый символ некоторой внутренней строки целым числом?

как

 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] + " ";
 }

Зависит от того, что вы подразумеваете под «чистым», но похоже, что это сработает, если все адреса будут сформированы так, как вы указали.

0 голосов
/ 29 июня 2009

То, что я сделал, но я сомневаюсь, что самое эффективное решение - это поменять адрес, а затем получить первую часть, пока вы не найдете цифру и не заберете их все. то есть регулярное выражение .*\d+ на обратном адресе. Это решает вашу проблему, когда на улице есть цифра.

...