Pergunta

Estamos desenvolvendo um aplicativo # c que as importações endereço de-dados em um CRM-sistema. O arquivo CSV contém um endereço de coluna como 'Somethingstreet 34'. Nosso CRM no entanto usa dois campos diferentes para o nome da rua eo housenumber . Claro que, no exemplo dado este não representa qualquer problema. Mas o nosso sistema de endereçamento holandês pode ser um pouco de dor.

exemplos do mundo real:

  • Somestreet 88a (onde 'Somestreet' é o nome da rua e 88a o housenumber)
  • 2e van 123a Blankenburgstraat (onde '2e van Blankenburgstraat' é o nome da rua, e '123a' é o housenumber)
  • 2e van Blankenburgstraat 123-A (onde '2e van Blankenburgstraat' é o nome da rua, e '123-A' é o housenumber)
  • 2e van Blankenburgstraat 123-A (onde '2e van Blankenburgstraat' é o nome da rua, e '123 a' é a housenumber)

Agora eu estou olhando para uma função agradável (RegEx ou algo assim) que divide esses addresslines corretamente em dois campos. Existe uma maneira limpa agradável de fazer isso?


Editar:

Eu fiz alguma investigação adicional em nosso sistema de endereçamento e parece (obrigado governo) que os exemplos acima não são mesmo os 'piores ones'.

Alguns mais (estes são ruas reais e números):

  • Rivium 1e Straat 53 / ET6 (onde 'Rivium 1e Straat' é a rua e '53 / ET6' é o housenumber)
  • Plein 1940-1945 34 (onde 'Plein 1940-1945' é a rua e '34' é o housenumber)
  • Apollo 11-Laan 11 (onde 'Apollo 11-Laan' é a rua e '11' (o segundo) é o housenumber)
  • Carta 77 Vaart 159 3H (onde 'Carta 77 Vaart' é o nome da rua e '159 3H' é o housenumber)
  • Carta 77 Vaart 44/2 (onde 'Carta 77 Vaart' é o nome da rua e '44 / 2' é a housenumber)
Foi útil?

Solução

A melhor solução para correção de dados seria a de comparar o banco de dados existente contra uma api endereço conhecido que tem uma função para fazer isso por você. Caso contrário, você está apenas dando o seu melhor palpite e alguns, se não todos, os dados devem ser revistos manualmente.

Outras dicas

O que eu fiz, mas eu duvido que é a solução mais alto desempenho é para reverter o endereço e, em seguida, começar a primeira parte até encontrar um dígito e levá-los todos. ou seja, o .*\d+ regex no endereço inversa. Isto resolve o problema quando uma rua contém um dígito.

Você pode fazer algo que você dividir em espaços e, em seguida, verifique se o primeiro caractere de uma string interior é um inteiro?

como

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

Depende do que você quer dizer com 'clean', mas ele parece que iria trabalhar, se todos os endereços podem ser formados da maneira especificada.

Existem muitas maneiras diferentes que alguém poderia entrar esses dados. Muitas vezes eu escrever o meu endereço como:

123 Foo Rua Apt # 3

ou seja, com os números das casas e apartamentos em cada extremidade do nome da rua

Se este era o meu problema eu iria escrever um regex que manipula o "fáceis" queridos e bandeiras as mais complicadas para revisão humana.

Você pode encontrar uma lista de nomes de rua nos EUA do Departamento do Censo, mas é enterrado dentro de um monstro arquivo de dados

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top