Frage

Wir entwickeln eine c # -Anwendung, die Einfuhren Adressdaten in ein CRM-System. Die CSV-Datei enthält eine Adresse-Säule wie ‚Somethingstreet 34‘. Unsere CRM jedoch verwendet zwei verschiedene Felder für die Straßennamen und die Hausnummer . Natürlich stellt sich in dem gegebenen Beispiel dies kein Problem. Aber unser niederländisches Adressieren-System kann ein bisschen wie ein Schmerz sein.

Reale Welt Beispiele:

  • Somestreet 88a (wobei 'Somestreet' ist der Straßenname und 88a der Hausnummer)
  • 2e van Blankenburgstraat 123a (wobei '2e van Blankenburgstraat' die Strasse- ist, und '123a' ist die Hausnummer)
  • 2e van Blankenburgstraat 123-a (wobei '2e van Blankenburgstraat' ist der Strasse- und '123-a' ist die Hausnummer)
  • 2e van Blankenburgstraat 123 a (wobei '2e van Blankenburgstraat' ist der Strasse- und '123 a' ist die Hausnummer)

Jetzt suche ich eine nette Funktion (RegEx oder etwas), die diese addresslines korrekt in zwei Felder aufteilt. Gibt es eine schöne, saubere Art und Weise, dies zu tun?


Bearbeiten

habe ich einige weitere Untersuchungen auf unserem Adressierungssystem und es scheint (danke Regierung), dass die obigen Beispiele sind nicht einmal die ‚schlimmsten‘ Einsen.

etwas mehr (dies sind echte Straßen und Zahlen):

  • Rivium 1e Straat 53 / ET6 (wobei 'Rivium 1e Straat' die Straße ist und '53 / ET6' ist die Hausnummer)
  • Plein 1940-1945 34 (wobei 'Plein 1940-1945' ist die Straße und '34' ist die Hausnummer)
  • Apollo 11-Laan 11 (wobei 'Apollo 11-Laan' die Straße ist, und '11' (die zweite) ist die Hausnummer)
  • Charta 77 Vaart 159 3H (wobei 'Charta 77 Vaart' ist der Straßenname und '159 3H' ist die Hausnummer)
  • Charta 77 Vaart 44/2 (wobei 'Charta 77 Vaart' ist die Strasse- und '44 / 2' ist die Hausnummer)
War es hilfreich?

Lösung

Die beste Lösung für die Richtigkeit der Daten wäre es, die vorhandene Datenbank gegen eine bekannte Adresse api zu vergleichen, die eine Funktion dies für Sie zu tun hat. Ansonsten sind Sie nur Ihre beste Vermutung und einige geben, wenn nicht alle, sollten die Daten manuell überprüft werden.

Andere Tipps

Was ich tat, aber ich bezweifle, dass es die performante Lösung ist, um die Adresse zu ändern und dann den ersten Teil erhalten, bis Sie eine Ziffer und nehmen sie alle finden. das heißt, die regex .*\d+ auf die umgekehrte Adresse. Dies löst Ihr Problem, wenn eine Straße eine Ziffer enthält.

Können Sie etwas tun, wo man auf die Felder aufgeteilt, und dann überprüfen, um zu sehen, ob das erste Zeichen von einigen Innen Zeichenfolge eine ganze Zahl?

wie

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

Abhängig von, was Sie mit ‚sauberen‘, aber es sieht wie das funktionieren würde, wenn alle Adressen die Art und Weise gebildet werden können, die Sie angegeben.

Es gibt zu viele verschiedene Möglichkeiten, jemand könnte diese Daten eingeben. Ich schreibe oft meine Adresse wie:

123 Foo Straße Apt # 3

dh mit den Haus- und Wohnungszahlen an beiden Enden des Straßennamen

Wenn das mein Problem ist, würde ich einen regulären Ausdruck schreiben, die die „easy“ Einsen und Fahnen Greifen die komplizierte für die menschliche Bewertung.

Sie können eine Liste von Straßennamen in den USA aus dem Census Bureau finden, aber es ist innerhalb eines Monsters Datenfile begraben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top