Лучший способ разделить адресную строку на два поля

StackOverflow https://stackoverflow.com/questions/1059513

Вопрос

Мы разрабатываем приложение на 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' - номер дома)

Теперь я ищу хорошую функцию (регулярное выражение или что-то в этом роде), которая правильно разбивает эти адресные строки на два поля.Есть ли хороший чистый способ сделать это ?


Редактировать:

Я провел некоторое дальнейшее исследование нашей системы адресации, и, похоже (спасибо правительству), приведенные выше примеры даже не являются "худшими".

Еще немного (это реальные улицы и номера):

  • Rivium 1e Straat 53/ET6 (где 'Rivium 1e Straat' - улица, а '53/ET6' - номер дома)
  • Плейн 1940-1945 34 (где "Плейн 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, у которого есть функция, позволяющая сделать это за вас.В противном случае вы просто высказываете свое лучшее предположение, и некоторые, если не все, данные следует просмотреть вручную.

Другие советы

То, что я сделал, но я сомневаюсь, что это самое эффективное решение, - это поменять адрес местами, а затем получить первую часть, пока вы не найдете цифру и не возьмете их все.т. е.регулярное выражение .*\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