Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Strassenname, Hausnummer und Zusatz trennen!? (https://www.delphipraxis.net/74299-strassenname-hausnummer-und-zusatz-trennen.html)

pumpe 1. Aug 2006 08:03


Strassenname, Hausnummer und Zusatz trennen!?
 
Hallo!

Also ich habe Daten bekommen .DBF Datei die ich in eine neue Tabelle in Oracle unterbringen soll. In der Datei sind Strassenname, Hausnummer und Zusatz in einem Feld und sollen in Oracle in 3Felder aufgeteilt werden. Das Problem ist die Schreibweise. Manchmal steht Mustermannstr.5, Max Mustermann Strasse 5, Mustermannstr.5a, Mustermannstr 5 a, also verschiedenste Schreibweisen.

Wie kann ich die Strasse, Nummer und den Zusatz nun trennen?

Danke schonmal für Eure Antworten

Angel4585 1. Aug 2006 08:19

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
naja es gibt ja sowsa wie

Delphi-Quellcode:
for i:= 1 to Pred(Length(mystring))do
  if mystring[i] in ['0'..'9'] then
    begin
    //zuerst noch checken wie lange die Zahl ist
    //und dann aufsplitten
    end;

RavenIV 1. Aug 2006 08:23

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
also ich würde den String von Hinten aufrollen.
- es ist solange "Zusatz", bis eine Zahl kommt.
- dann ist es solange "Hausnummer", bis keine Zahl mehr kommt.
- der Rest ist "Strasse"

alles klar?

freak4fun 1. Aug 2006 08:33

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Da die Daten so gespeichert wurden müssten sie ja auch in einem Programm wiedr angezwigt worden sein. Gab es da dann keine Regel zum zerflücken? Wenn da kein Trennzeichen oder sonst eine erkennbare Regel hinter steht wird es schwierig das zu automatisieren.

MfG
freak

pumpe 1. Aug 2006 08:39

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Danke für Eure Hilfe.

Nein die Strasse, Hausnummer und Zusatz wurden im Programm in einem Feld angezeigt und sollen jetzt im neuen Programm in den jeweiligen Feldern angezeigt werden.

@ RavenIV Ja vom Prinzip hab ich verstanden aber machen iss ne andere Sache :roll: Ihr müsst mir jetzt auch nich den Code hinschreiben nur einmal anstossen von hinten.

Catbytes 1. Aug 2006 08:50

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Hi,

aufpassen bei ausländischen Adressen!

In Frankreich schreibt man IMHO: Nummer, Straße

Jürgen Thomas 1. Aug 2006 09:10

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Genau das ist das richtige Verfahren (so habe ich es seit 1986 mehrfach gemacht):
Zitat:

Zitat von RavenIV
also ich würde den String von hinten aufrollen.
- es ist solange "Zusatz", bis eine Zahl kommt.
- dann ist es solange "Hausnummer", bis keine Zahl mehr kommt.
- der Rest ist "Strasse"

alles klar?

Ich möchte nur noch auf folgende Besonderheiten aufmerksam machen:

1. Es kann auch Adressen ohne Hausnummer geben (z.B. durch Nachlässigkeit bei der Eingabe).

2. Postfach-Adressen müssen vorab ausgesondert werden, weil die PF-Nummer häufig Leerzeichen enthält: "Postfach 13 44 04". Dabei gibt es auch Abkürzungen wie "PF". (Weil es oft Adressen gibt mit Hausanschrift und Postfachanschrift, sollten in einer Adressen-Datenbank beide Varianten enthalten sein.)

3. In Mannheim gibt es Straßen wie "Q 2"!

Zitat:

Zitat von Catbytes
aufpassen bei ausländischen Adressen!

In Frankreich schreibt man IMHO: Nummer, Straße

4. So ist es, und außerdem... Nach meinen Erfahrungen empfehle ich: Bei allen ausländischen Schreibweisen, die nicht in das Schema "Straße, Nummer, Zusatz" passen, wird die komplette Anschrift in "Straße" eingetragen; auf Datenabgleich mit der korrekten Schreibweise der Straße (und Änderungen des Straßennamens usw.) muss dann verzichtet werden.

5. Es ist zu klären, ob im Zusatz "13 a" bzw. "13a" das führende Leerzeichen grundsätzlich erhalten bzw. eingefügt oder entfallen soll. Ich empfehle, es nicht zu speichern.

6. Ebenso ist zu klären, ob in einer Situation wie "Straße 13 Nr. 14" das "Nr." gespeichert werden soll. Ich empfehle dringend "nein", weil sonst die Kontrolle mit amtlichen Daten schief geht. Achtung: Wenn in diesem Fall die Hausnummer fehlt, stehen wir auf dem Schlauch; aber einen Straßennamen wie "Straße" oder "Platz" gibt es nicht.

7. Das Leerzeichen nach dem Ende der Straße sollte immer entfernt werden. Außerdem ist zu regeln, ob "Straße" oder "Strasse" oder "Str." zu speichern ist (das ist wegen des einheitlichen Erscheinungsbildes sinnvoll).

Aus diesen Gründen sollte die Ziel-Datenbank beim Erzeugen einer Druckanschrift ggf. das Leerzeichen vor den Zusatz und vor der Hausnummer automatisch einfügen.

Zitat:

Zitat von pumpe
Danke für Eure Hilfe.

Nein die Strasse, Hausnummer und Zusatz wurden im Programm in einem Feld angezeigt und sollen jetzt im neuen Programm in den jeweiligen Feldern angezeigt werden.

@ RavenIV Ja vom Prinzip hab ich verstanden aber machen iss ne andere Sache :roll: Ihr müsst mir jetzt auch nich den Code hinschreiben nur einmal anstossen von hinten.

Na, ein bisschen solltest Du auch noch arbeiten. Als Anhaltspunkt kannst Du Folgendes verwenden:
Delphi-Quellcode:
procedure Strasse_to_Details( sQuelle: string; var sStrasse: string; var iNr: integer; var sZusatz: string; var sPostfach: string)
var c0: char; s0, s1, s2: string; i0, iNrLaenge: int; bNummer: boolean;
begin
  sStrasse = ''; sZusatz = ''; sPostfach = ''; iNr = 0;
  //  um unterschiedliche Schreibweisen abzufangen
  s0 = AnsiLowerCase(sQuelle);
  //  Postfach herausholen
  s1 = Copy( s0, 1, 8);
  s2 = Copy( s0, 1, 2);
  if ( (s1 = 'postfach') or (s2 = 'pf') ) then
  begin
    //  Startposition der Nummer suchen
    i0 = 0;
    repeat
      Inc(i0);
    until s0[i0] in ['0'..'9'];
    //  beim nächsten Befehl mache ich es mir einfach: max. 6 Ziffern + 2 Leerzeichen
    sPostfach = Copy(s0, i0, 8);
  end
  else begin
    //  jetzt fehlt die Prüfung, ob überhaupt eine Hausnummer enthalten ist
    //  oder in den o.g. Fällen 3 und 5 fehlt
    //  endet die Quelle mit einer Ziffer?
    i0 = Length(s0);
    bNummer = s0[i0] in ['0'..'9'];
    //  nein: Zusatz herausholen
    if (not bNummer) then
    begin
      repeat
        Dec(i0);
      until s0[i0] in ['0'..'9'];
      //  bei der Länge des Zusatzes mache ich es mir einfach; aber es könnte auch
      //  Situationen geben wie " a Wohnung 03-44", aber das hängt auch davon ab,
      //  was die Ziel-Datenbank vorsieht
      //  [/edit]muss vom Original genommen werden
      sZusatz = Copy(sQuelle, i0+1, 15);
    end;
    //  jetzt steht i0 auf der letzten Ziffer der Hausnummer
    iNrLaenge = 0;
    repeat
      Dec(i0);
      Inc(iNrLaenge);
    until not (s0[i0] in ['0'..'9']);
    //  StrToInt führt z.B. bei leerem String zu Exception
    try
      iNr = StrToInt( Copy(s0, i0+1, iNrLaenge);
    except
      iNr = 0;
    end;
    //  Rest ist Straße
    //  [/edit]muss vom Original genommen werden
    sStrasse = Copy(sQuelle,1,i0);
  end;
end;
Bitte nicht sauer sein, wenn das so nicht direkt funktioniert: Zurzeit schreibe ich nur C#; also könnte es sein, dass ich mit Delphi-Schreibweisen und Standardfunktionen durcheinander komme. Ich habe es nicht getestet, nur direkt hingeschrieben, ohne exakt auf Sauberkeit zu achten.

Jürgen

moonwhaler 1. Aug 2006 09:23

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Hi,

ich hatte ein ähnliches Problem (bei mir ging es vor allem um Sortierung) vor nicht allzulanger Zeit und habe da einige kleine Funktionien gebastelt. Die decken leider nicht alle Sonderfälle ab, aber ich denke man kann diese notfalls sicher erweitern:

Delphi-Quellcode:
function ExtractNumberFromString( s: String ): String;
function ExtractIntegerFromString( s: String ): Integer;
Delphi-Quellcode:
function ExtractIntegerFromString( s: String ): Integer;
var
  i: Integer;
  tmpstr: String;
begin
  tmpstr := '';

  // String cleanup...
  while ( pos( ' ', s ) > 0 ) do
    s := StringReplace( s, ' ', ' ', [rfReplaceAll, rfIgnoreCase] );

  // Extract the number (that maybe contains alphanumeric data)
  s := ExtractNumberFromString( trim( s ) );

  // Now try to get all NUMERIC data - in case the current char is not
  // NUMERIC break the loop. That will prevent to add a "false" number
  // like in street names "maggiestreet 22/2b" >> "22"
  for i:=1 to length( s ) do
    if ( s[i] in ['0'..'9'] ) then
      tmpstr := tmpstr + s[i]
    else
      break;

  result := StrToIntDef( tmpstr, -1 );
end;

function ExtractNumberFromString( s: String ): String;
var
  i: Integer;
  currentdepth: Byte;
  lastknown: SmallInt;
const
  maxdepth: Byte = 4;
begin
  result := '';
  currentdepth := 0;
  lastknown := 0;

  for i:=length( s ) downto 1 do
  begin
    if ( s[i] in ['0'..'9'] ) then
    begin
      lastknown := i;
      currentdepth := 0;
    end else
      inc( currentdepth );

    if ( currentdepth > maxdepth ) then
    begin
      if ( lastknown > 0 ) then
        result := copy( s, lastknown, length( s ) );

      break;
    end;
  end;
end;
Grundsätzlich arbeiten beide Funktionen recht ähnlich. Ein Beispiel:
Neumannstrasse 22 c

Ergebnis (ExtractNumberFromString):
22 c

Ergebnis (ExtractIntegerFromString):
22

Man kann die Tiefe der Suche entsprechend anpassen, d.h. wann gilt eine Hausnummer noch als Hausnummer und wann nicht mehr. Tiefe bedeutet also alle nicht numerischen Zahlen:

Delphi-Quellcode:
maxdepth: Byte = 4;
Es ging mir dabei wie gesagt primär um die korrekte (natürliche) Sortierung von Strassen inklusive Hausnummern. Bitte verzeih, dass dabei derzeit der Strassenname selbst nicht ausgegeben wird. Dies wäre aber ebenfalls leicht erweiterbar. Ich hoffe das hilft wenigstens ein bischen...

pumpe 1. Aug 2006 09:44

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Super danke euch. Im Groben haut es schon hin, nur noch ein bißchen feintuning!

Seid echt Klasse Team hier! :thumb:

Hansa 1. Aug 2006 09:55

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Versuche besser demjenigen, der das so haben will das auszuureden, denn : es ist kontraproduktiv. Mußte selber mal ca. 500.000 Adressen (hauptsächlich aus Nachbarländern) bearbeiten. Es ging darum, Doubletten zu entfernen. Letztenendes sah der Vergleich so aus : Länderkürzel + PLZ + erste 3 Zeichen des Namens + erste 3 Zeichen der Straße. Man glaubts nicht, was es alles gibt. :shock: Unterschätze auch nicht die Phantasie der User. Siehe Catbytes Beitrag. Frankreich : Hausnummern am Anfang. Mannheim ist auch keine Ausnahme. Weiter gehts mit : "Straße des 13. Januar", "5th Avenue", Hausnummer "15a". Postfächer machen Ärger und den Rest eben die User : Teile des Namens werden in die Straße geschrieben oder umgekehrt, z.B. Lieferanschrift, Urlaubsadresse. Diese Straße habe ich mehrfach gesehen : . oder diese : _______________________ Der . war mir zuerst nicht klar, durch die andere "Straße" allerdings dann doch. Schreibfehler kommen dann natürlich auch noch. "8ahnhofstr." : jedem Briefträger klar, was das ist, einem Computer aber nicht.

P.S.: gerade am Feintuning hängts !


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr.
Seite 1 von 3  1 23      

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