Domanda

Stiamo sviluppando un'applicazione c# che importa indirizzo-dati in un sistema CRM.Il file CSV contiene un indirizzo di colonna come 'Somethingstreet 34'.Il nostro CRM tuttavia utilizza due diversi campi per il streetname e il numero civico.Naturalmente, in questo esempio, questo non rappresenta un problema.Ma il nostro olandese di indirizzamento di sistema può essere un po ' di dolore.

Esempi reali:

  • Somestreet 88a (dove 'Somestreet' è il streetname e 88a il numero civico)
  • 2e van Blankenburgstraat 123a (dove '2e van Blankenburgstraat' è il streetname, e '123a' è il numero civico)
  • 2e van Blankenburgstraat 123-a (dove '2e van Blankenburgstraat' è il streetname, e '123-a' è il numero civico)
  • 2e van Blankenburgstraat 123 (dove '2e van Blankenburgstraat' è il streetname, e '123' è il numero civico)

Ora sto cercando una bella funzione (RegEx o qualcosa del genere) che divide questi addresslines correttamente in due campi.C'è un bel modo pulito per fare questo ?


edit:

Ho fatto qualche ulteriore indagine sul nostro sistema di indirizzamento e sembra (grazie governo) che gli esempi sopra riportati non sono anche il 'peggiore' quelli.

Alcuni di più (queste sono vere e proprie strade e numeri):

  • Rivium 1e Straat 53/ET6 (dove 'Rivium 1e Straat' è la strada e '53/ET6' è il numero civico)
  • Plein 1940-1945 34 (dove 'Plein 1940-1945' è la strada e '34' è il numero civico)
  • Apollo 11-Laan 11 (dove 'Apollo 11-Laan' è la strada e '11' (il secondo) è la numero civico)
  • Charta 77 Vaart 159 3H (dove la 'Charta 77 Vaart' è il streetname e '159 3H' è il numero civico)
  • Charta 77 Vaart 44/2 (dove la 'Charta 77 Vaart' è il streetname e '44/2' è il numero civico)
È stato utile?

Soluzione

La soluzione migliore per la correttezza di dati sarebbe quello di confrontare il database esistente contro un noto indirizzo di api che ha una funzione per fare questo per voi.Altrimenti stai solo dando l'ipotesi migliore e alcuni, se non tutti, dei dati deve essere controllato manualmente.

Altri suggerimenti

Quello che ho fatto, ma mi viene il dubbio che sia il più performante soluzione è quella di invertire l'indirizzo e, quindi, ottenere la prima parte fino a trovare una cifra e prendere tutti.cioèla regex .*\d+ sul invertito indirizzo.Questo risolve il problema, quando una street contiene una cifra.

Si può fare qualcosa in cui è diviso sugli spazi, e quindi controllare per vedere se il primo carattere di alcuni interni stringa è un numero intero?

come

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

Dipende da cosa si intende per 'pulire', ma lo fa apparire come funzionerebbe, se tutti gli indirizzi possono essere formate specificato.

Ci sono molti modi diversi qualcuno potrebbe inserire questi dati.Mi capita spesso di scrivere il mio indirizzo:

123 Pippo Strada Apt#3

cioè con la casa e il numero dell'appartamento di via del nome

Se questo era il mio problema vorrei scrivere un'espressione regolare che gestisce il "facile" e le bandiere del complicato per la revisione umana.

È possibile trovare un elenco dei nomi delle strade in NOI dal Census Bureau, ma è sepolto all'interno di un mostro datafile

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top