Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   wie Adresse auseinandernehmen (https://www.delphipraxis.net/170207-wie-adresse-auseinandernehmen.html)

khh 5. Sep 2012 12:24

Datenbank: Firebird • Version: 2.1 • Zugriff über: zeos

wie Adresse auseinandernehmen
 
hallo zusammen
ich habe in einem Feld Adressdaten wie folgt:

Auf dem Eifelturm 1
Schlossberg 12
Hauptstr. 62-64

ich möchte die Hausnummern separat speichern.

Jemand ne Idee, wie ich das hinbekomme?
Mein Ansatz wäre per stringreplace ein sonderzeichen einzufügen und dann dort zu trennen.
Aber weiter stehe ich grad auf dem Schlauch :-(

Ich danke euch
khh

mkinzler 5. Sep 2012 12:25

AW: wie Adresse auseinandernehmen
 
Oder den letzten Block abtrennen

khh 5. Sep 2012 12:26

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von mkinzler (Beitrag 1181652)
Oder den letzten Block abtrennen

ja, aber wie ?

Grolle 5. Sep 2012 12:30

AW: wie Adresse auseinandernehmen
 
Mit Hier im Forum suchenpos und Hier im Forum suchencopy?

Bummi 5. Sep 2012 12:35

AW: wie Adresse auseinandernehmen
 
Per Delphi?

Durchlaufen bis zum ersten ['0'..'9'] , ab da als Hausnummer behandeln ?

Nersgatt 5. Sep 2012 12:37

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von Bummi (Beitrag 1181660)
Durchlaufen bis zum ersten ['0'..'9'] , ab da als Hausnummer behandeln ?

Und hoffen, dass niemand an der "Straße des 17. Juni" wohnt.... :stupid:

mkinzler 5. Sep 2012 12:37

AW: wie Adresse auseinandernehmen
 
Oder per TStringList.

Delphi-Quellcode:
var
  sl: TStrings;
  ...
  sl := TStringList.Create;
  sl.Delimiter := ' ';
  sl.DelimitedText := <Str mit Hausnummer>;
  <hausnummer> := sl[sl.Count-1];
  sl.Delete( sl.Count-1);
  <str> := sl.Text;
  ..
  sl.Free;

khh 5. Sep 2012 12:37

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von Bummi (Beitrag 1181660)
Per Delphi?

Durchlaufen bis zum ersten ['0'..'9'] , ab da als Hausnummer behandeln ?


warum kommt man auf die einfachsten Dinge nicht selbst ;-)
EDIT : mh die Straße des 17. Juni sollte manuell zu finden sein :-)

ich danke dir / euch

uligerhardt 5. Sep 2012 12:39

AW: wie Adresse auseinandernehmen
 
Grobe Idee:
  1. Den String rückwärts nach dem ersten Whitespace (Leerzeichen, Tab etc.) durchsuchen.
  2. Alles dahinter (also 1, 12 bzw. 62-64 in deinen Beispielen) in eine StringList mit Delimiter '-' stecken.
  3. Bei allen Elementen der StringList prüfen, ob sie eine Hausnummer sind, also z.B. nur aus Ziffern und evtl. hintendran einem Buchstaben ("Schlossberg 12a") bestehen.
  4. Falls ja, den Kandidaten aus Schritt 1 akzeptieren.
False positives und negatives wirst du nicht vermeiden können. Und ob du jetzt "Schlossberg 12 1/2" behandeln willst oder "Schlossberg 12, 3. Stock"...

khh 5. Sep 2012 12:39

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von mkinzler (Beitrag 1181663)
Oder per TStringList.

Delphi-Quellcode:
var
  sl: TStrings;
  ...
  sl := TStringList.Create;
  sl.Delimiter := ' ';
  sl.DelimitedText := <Str mit Hausnummer>;
  <hausnummer> := sl[sl.Count-1];
  sl.Delete( sl.Count-1);
  <str> := sl.Text;
  ..
  sl.Free;

ich probiers erst mal so
EDIT: funktioniert (fast)einwandfrei.
die Leerzeichen zwischen den Strassennahmen die aus mehreren Wörtern bestehen werden eliminiert :-(
ich danke euch

-=ZGD=- 5. Sep 2012 13:24

AW: wie Adresse auseinandernehmen
 
Solch ähnliche Lösungen hatte ich auch mal.
Problem war dann, dass irgendwann Hausnummern im Stil von
Code:
128 - 130
vorlagen.

Am besten nimmst du den kompletten String und extrahierst ab dem ersten Vorkommnis einer Zahl bis zum Ende alles als Hausnummer.

Leerzeichen dazwischen kannst du natürlich danach noch immer entfernen.

Quasi so, wie Bummi es schon beschrieben hat.

BlackbirdBerlin 5. Sep 2012 13:34

AW: wie Adresse auseinandernehmen
 
Hi zusammen.

Um noch einen weiteren Sonderfall mit rein zu bringen:

In Berlin (und anderen Städten sicherlich auch) gibt es auch Straßen ohne Namen:

eine Adresse dort wäre z.B.
Straße 136 5

Wobei hier die 5 die Hausnummer ist. (was mit dem vorgenannten Ansatz zur Falscherkennung führen würde)

Ich würde prinzipiell die am weitesten rechts stehenden Ziffern (ggf. mit Index a, b oder ähnlichen und ggf. mit von/bis, wie schon genannt "128 - 130") als Hausnummer betrachten und alles andere als den Straßennamen.

Viele Grüße,
Tim

nahpets 5. Sep 2012 19:05

AW: wie Adresse auseinandernehmen
 
Hallo,

beschäftige mich seit vielen Jahren mit dem Thema. Die perfekte Lösung gibt es nicht.
Die besten (aber nicht perfekten) Ergebnisse habe ich bisher mit folgender Logik erreicht:
  1. von rechts nach links alles nehmen, was keine Ziffer ist. (Teil 3)
  2. dann alles nehmen, was kein Buchstabe ist. (Teil 2)
  3. Alles was davor ist, ist die Straße. (Teil 1)
  4. Alle drei Teile von führenden und folgenden Leerzeichen bereinigen.
Die Hausnummer hat man in Teil 2 und alles was hinter der Hausnummer ist (Teil 3), kommt in ein Feld Hausnummernzusatz. Die Trennung von Straße nur in Straße und Hausnummer ist nicht sinnvoll, spätestens bei Adressvergleichen stört alles, was in der Hausnummer steht, aber eigentlich nicht zur Hausnummer gehört.
Ggfls. kann man bei Teil 3 noch prüfen, ob er nur aus einem Buchstaben besteht, um Hausnummern der Form 12a zu separieren.

Diese Logik scheitert im o.g. Beispiel von Berlin, aber auch in Mannheim (siehe z. B. http://rhein-neckar-wiki.de/Stra%C3%...%28Mannheim%29) oder bei Straßennamen der Form An der B 222 1a. Hier ist die 222 noch Teil des Straßennamens und 1a die Hausnummer. Und natürlich scheitert es auch bei o. g. Schlossberg 12, 3. Stock.

hoika 5. Sep 2012 19:20

AW: wie Adresse auseinandernehmen
 
Hallo,
einfache Antwort?
Vergiss es.
Viel zu viele Probleme.

Heiko

generic 6. Sep 2012 14:58

AW: wie Adresse auseinandernehmen
 
Es ist unmöglich die Adresse z.B. mit RegEx auseinander zu nehmen.

Denkt mal an Mannheim oder an Flurstücknummern.

Was du machen kannst, ist z.B. von der Post die Datafactory nutzen.
Dort stehen alle Straßen und Orte drin.
Mit diesen Tabellen trennst du die Straße von der ggf. vorhandenen Nummer.

shmia 6. Sep 2012 16:23

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von nahpets (Beitrag 1181736)
beschäftige mich seit vielen Jahren mit dem Thema

Dito!
Das Trennen von Strassennamen, Hausnummer und Hausnummerzusätze ist sehr schwierig. (es ist fast schon KI nötig)
Man braucht für jede Ausnahme extra Code der dies behandelt.

Meine letzte Idee (die ich aber noch nicht umgesetzt habe) war, dass man den String "tokenizen" müsste.
A=Buchstabenkette
B=Einzelbuchstabe
9=Ziffernkette
8=Ziffernkette gefolgt von Punkt
x=Trennzeichen / oder - oder , oder .
_=Folge von Leerzeichen

Schlossberg 12, 3. Stock wäre also das Muster A_9x_8_A
M 17,3 entspräche Muster B_9x9
Für jedes Muster muss man sich zusätzlich speichern, wo die Strasse und wo die Hausnr steckt.
Mit 20 bis 50 verschiedenen Mustern kann man so evtl. alle Schreibweisen abdecken.

Nersgatt 7. Sep 2012 07:09

AW: wie Adresse auseinandernehmen
 
Und an dieser Stelle muss man dann überlegen, ob es den Aufwand wert ist, dafür überhaupt komplizierten Quellcode zu schreiben. Vielleicht sind es nur so wenige Datensätze (wenige tausend), dass es sinnvoller wäre, ein einfaches Programm zu schreiben (nur die letzten Zahlen nehmen, z.B.). Und dann setzt man nochmal den Azubi 3 Stunden dran, um die Daten zu überprüfen und ggf. händisch nachzuarbeiten.

khh 7. Sep 2012 07:28

AW: wie Adresse auseinandernehmen
 
alsoo

ich habe jetzt von hinten die Zahlen abgetrennt.
Da das natürlich nicht optimal ist, muss jemand( der AZUBI ist ne gute Idee :thumb:)die DS nochmal durchgehen.
Das ist zwar im Moment ausreichend, aber leider keine endgültige Lösung, da sicher noch ein paar Tausend Sätze dazu kommen werden.

Nersgatt 7. Sep 2012 07:46

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von khh (Beitrag 1181926)
Das ist zwar im Moment ausreichend, aber leider keine endgültige Lösung, da sicher noch ein paar Tausend Sätze dazu kommen werden.

Dann mach noch ein Feld "gesichtet" rein. Damit sich der Azubi zukünftig nur die Datensätze rausfiltern kann, die er noch nicht überprüft hat.

Daniela.S 7. Sep 2012 07:46

AW: wie Adresse auseinandernehmen
 
warum verwendet ihr nicht Regular Expressions? Bietet sich doch an...

http://www.regular-expressions.info/delphi.html

jfheins 7. Sep 2012 08:26

AW: wie Adresse auseinandernehmen
 
Zum Beispiel weil:
Zitat:

Zitat von generic (Beitrag 1181854)
Es ist unmöglich die Adresse z.B. mit RegEx auseinander zu nehmen.

:wink:
Zum Thema: Ich hatte auch letztens eine Adresse ohne Hausnummer :mrgreen:
Zitat:

Messe Essen
Halle 8
Norbertstraße
45131 Essen
Ich würde auch sagen, dass sich die Adresse nicht zuverlässig aus einem String extrahieren lässt. Man kann vielleicht 99% der Fälle mit einem guten RegEx erschlagen, aber beim Rest wird Handarbeit nötig...

Daniela.S 7. Sep 2012 10:50

AW: wie Adresse auseinandernehmen
 
Ich finde es keineswegs unmöglich. Du meinst mit herkömmlichen Methoden kommst du über die 99% ?

Im Grunde wird mit dem String zerlegen nur selber etwas nachgebaut, das RegEx bereits von Haus aus bietet.
Mit RegEx kannst du die Anschrift zumindest recht einfach auch auf verschiedene Patterns prüfen und erkennen in welchem Format sie eingegeben wurde.

-=ZGD=- 7. Sep 2012 11:09

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von Daniela.S (Beitrag 1181973)
Ich finde es keineswegs unmöglich. Du meinst mit herkömmlichen Methoden kommst du über die 99% ?

Im Grunde wird mit dem String zerlegen nur selber etwas nachgebaut, das RegEx bereits von Haus aus bietet.
Mit RegEx kannst du die Anschrift zumindest recht einfach auch auf verschiedene Patterns prüfen und erkennen in welchem Format sie eingegeben wurde.

Das unterschreib ich so.
Vorteil: Wenn du mal ungefähr weißt, wie es aufgebaut ist, sprich welches Pattern, kannst du gezielt Methoden darauf anwenden um Adressdaten zu extrahieren.

jfheins 7. Sep 2012 11:36

AW: wie Adresse auseinandernehmen
 
Zitat:

Zitat von Daniela.S (Beitrag 1181973)
Ich finde es keineswegs unmöglich. Du meinst mit herkömmlichen Methoden kommst du über die 99% ?

Mit ist bewusst, was ein RegEx ist und was er kann. (Und was nicht.)

Mit Handarbeit meinte ich hier tatsächlich den Menschen, der sich die Adresse anguckt, scharf nachdenkt und dann (falls existent) die Hausnummer eintippen kann. Mit der Hand. Nix automatisch.

nahpets 7. Sep 2012 12:08

AW: wie Adresse auseinandernehmen
 
Hallo,

weiter oben schrieb ich, dass ich mich seit vielen Jahren mit dem Thema beschäftige.
Wir haben zuletzt die Erfahrung gemacht, dass selbst Profiwerkzeuge wie qAdress und Uniserv (wo vermutlich viele Jahre Manpower hinterliegen) es nicht für alle Daten schaffen.

Bei allen Adressbeständen sollte man tunlichst drauf achten, das Straße, Hausnummer und irgendwelche Zusätze, nie in ein Feld "gedaddelt" werden, man bekommt es nicht auseinander (und Auszubildende haben besseres verdient, als diesen "Mist" geradezubiegen). Und behaupte mir niemand, Eingemeindungen und Straßenumbenennungen kommen selten vor. Kein bundesweiter Straßenbestand ist nach einem viertel jahr noch korrekt.

Große Adressbestände sollte man immer gegen vollständige Straßenverzeichnisse referenzieren und im Adressbestand nur den Fremdschlüssel auf diese Referenz ablegen (also die Daten normalisieren). Dies hat auch den Vorteil, dass bei Eingemeindungen, Straßenumbenennungen... nur die Daten in der Referenz geändert werden müssen und nicht die Datenbestände korrigiert werden müssen.

Die Masse der Straßennahmen ist fast überall in der Form Straße Hausnummer vorhanden, damit kommt man sicherlich locker über 95%. Der Rest ist auch über reguläre Ausdrücke nicht komplett korrekt aufzulösen. Man kann sich da noch soviele Muster überlegen, es gibt immer wieder Anwender, die noch eine weitere Idee haben, wie man da Murx hineinbekommt. In den letzten ca. 20 Jahren ist es mir jedenfalls nicht gelungen eine 100%ige Lösung zu finden oder jemanden zu finden, der diese bereits hat. Und ich bin mir sicher, gäbe es diese 100%ige Lösung, wäre sie in Profiwerkzeugen enthalten.

Sollte hier jemand diese Lösung finden, so meine Empfehlung: Patent auf den Algorithmus anmelden und meistbietend verkaufen oder lizensieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz