Pregunta

Estamos desarrollando una aplicación en c# que las importaciones dirección de datos en un CRM-sistema.El archivo CSV-contiene una dirección de columna como 'Somethingstreet 34'.Nuestro CRM sin embargo utiliza dos diferentes campos para el nombre de calle y el número.Por supuesto, en el ejemplo dado esto no plantea ningún problema.Pero nuestra holandés abordar-el sistema puede ser un poco de un dolor.

Ejemplos del mundo Real:

  • Somestreet 88a (donde 'Somestreet' es el nombre de calle y 88a el número)
  • 2e van Blankenburgstraat 123a (donde '2e van Blankenburgstraat' es el nombre de calle, y '123a' es el número)
  • 2e van Blankenburgstraat 123-a (donde '2e van Blankenburgstraat' es el nombre de calle, y '123-a' es el número)
  • 2e van Blankenburgstraat 123 un (donde '2e van Blankenburgstraat' es el nombre de calle, y '123 a' es el número)

Ahora estoy en busca de una buena función (RegEx o algo) que divide estos addresslines correctamente en los dos campos.Hay un bonito y limpio manera de hacer esto ?


editar:

Hice un poco de investigación adicional en nuestro sistema de direccionamiento y parece (gracias gobierno) que los ejemplos anteriores no son ni siquiera los 'peores' queridos.

Algunos más (estas son las calles reales y números):

  • Rivium 1e Straat 53/ET6 (donde 'Rivium 1e Straat' es la calle y '53/ET6' es el número)
  • Plein 1940-1945 34 (donde 'Plein 1940-1945' es la calle y '34' es el número)
  • Apolo 11-Laan 11 (donde 'Apollo 11-Laan' es la calle y el '11' (la segunda) es el número)
  • Charta 77 Vaart 159 3H (donde la "Charta 77 Vaart' es el nombre de calle y '159 3H' es el número)
  • Charta 77 Vaart 44/2 (donde la "Charta 77 Vaart' es el nombre de calle y '44/2' es el número)
¿Fue útil?

Solución

La mejor solución para los datos de corrección sería comparar la base de datos existente en contra de una dirección conocida de la api que tiene una función para hacer esto para usted.De lo contrario, usted está dando su mejor conjetura y algunos, si no todos, de los datos deben ser revisados manualmente.

Otros consejos

Lo que hice, pero no creo que es la solución mas potente es revertir la dirección y luego la primera parte hasta que se encuentre un dígito y llevarlos a todos. es decir, la expresión regular .*\d+ en la dirección inversa. Esto resuelve el problema cuando una calle contiene un dígito.

¿Se puede hacer algo, donde se divide en espacios, y después comprobar para ver si el primer carácter de una cuerda interior es un entero?

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 de lo que entendemos por 'limpia', pero que tiene un aspecto como el que quiere trabajar, si todas las direcciones se pueden formar de la manera especificada.

Hay muchos diferentes maneras alguien podría introducir estos datos. A menudo escribo mi dirección como:

123 Foo Calle # 3

es decir, con los números de casas y departamentos en cada extremo del nombre de la calle

Si esto era mi problema me gustaría escribir una expresión regular que se encarga de las "fáciles" y banderas de los más complicados para la revisión humana.

Puede encontrar una lista de nombres de las calles en los EE.UU. de la oficina de censo pero es enterrado dentro de un monstruo archivo de datos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top