Delphi-PRAXiS

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 !

Klaus01 1. Aug 2006 09:58

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

hier ist noch ein Thread der sich mit dem gleichen Thema beschäftigt hat.
http://www.delphipraxis.net/internal...=strassen+haus

Grüße
Klaus

pumpe 1. Aug 2006 10:00

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Oha ja, da beneide ich dich nicht. Ich habe zum Glück nur 2600 zu konvertieren das kann ich zur Not noch mal mit dem Auge überfliegen. Aber das mit den verschiedenen Schreibweisen hab ich auch schon beobachtet, aber wäre ja langweillig wenn alle User gleich wären. :stupid:

Catbytes 1. Aug 2006 10:07

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

falls es um Adressen geht, wo Ware hin versendet werden soll, gibt es noch einige Dinge mehr zu beachten:

* Lieferadresse kann von Postadresse (da, wohin die Rechnung gesendet wird) unterschiedlich sein
* Lieferadresse darf nie ein Postfach sein
* Es gibt auch Kostenstellenbelieferungen - dann muß die Kostenstelle (oder mehrere) mit der Lieferadresse verknüpft werden
* Es gibt auch Arbeitsplatzbelieferung ("Delivery at Work") - dann muß noch zusätzlich z.B.

Firma Mustermann
Herr Mustermann
Werksgelände 3
Haus 18
5. Stock
Zimmer 1
Musterstraße 1
12345 Musterstadt

mit eingeplant werden (also Haus, Werk, Zimmer etc.).

* In seltenen Fällen gibt es sogar mehrere, unterschiedliche Lieferadressen

Wenn Du wirklich professionelle Hilfe brauchst:
Omikron AdressCenter

Und zum suchen empfehle ich FactFinder von der gleichen Firma.

freak4fun 1. Aug 2006 10:12

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Es ging doch nur darum einen String richtig zu teilen, oder? :gruebel:

Könntest du vielleicht mal 3-4 Datensätze (Straße, Hausnummer, Zusatz) hier posten, also mit veränderten Daten natürlich. Vielleicht steht da ja ein Komma oder sowas. Ansonsten artet das hier in Spekulatius aus. :zwinker:

MfG
freak

pumpe 1. Aug 2006 10:19

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Feld:Strasse

Mühlfeldweg 4
Am Bach 16a
Brunnwiese 18 b
Wasserburgr Str. 14
Chiemseestr. 23
Th.-Körner-Str3
Kirchenstr.17
Angererstr. 20
Lebenau6
Pestalozzistr. 2
Wolfsberg 44
Hauptstr. 26

Catbytes 1. Aug 2006 10:20

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

Zitat von freak4fun
Es ging doch nur darum einen String richtig zu teilen, oder? :gruebel:

Korrekt - um ihn aber richtig zu teilen, muß man auch wissen, wie geteilt wird (nicht nur technisch, sondern auch syntaktisch).

"Normale" Postadressen sind was anderes wie Lieferadressen...

moonwhaler 1. Aug 2006 10:51

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

Zitat von Catbytes
Hi nochmals,
* Lieferadresse darf nie ein Postfach sein

Das kann ich so nicht nachvollziehen, da wir täglich sehr viel an Postfächer respektive Packstation verschicken, wenn es sich um Pakete handelt - Voraussetzung ist eine vorab Zahlung (Kreditkarte / Vorkasse / etc.). Einzige Einschränkung wäre, dass ein solcher Versand nur mit der Deutschen Post (DHL, was im Grunde das gleiche ist) möglich ist, da GLS / UPS / TNT / etc. diese nicht an solche ausliefern können, weil es sich um ein "Feature" der DP / DHL handelt.

Bis dann.

Catbytes 1. Aug 2006 10:57

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

Zitat von moonwhaler
Zitat:

Zitat von Catbytes
Hi nochmals,
* Lieferadresse darf nie ein Postfach sein

Das kann ich so nicht nachvollziehen

OK - wir liefern per GLS aus. Wie es mit anderen Versendern ist, weiß ich nicht. Es ist aber ungewöhnlich, z.B. ein 3x3 Meter Paket an ein Postfach zu senden ;)

Aber ich glaube wir werden langsam OT :mrgreen:

moonwhaler 1. Aug 2006 11:23

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

Zitat von Catbytes
Zitat:

Zitat von moonwhaler
Zitat:

Zitat von Catbytes
Hi nochmals,
* Lieferadresse darf nie ein Postfach sein

Das kann ich so nicht nachvollziehen

Es ist aber ungewöhnlich, z.B. ein 3x3 Meter Paket an ein Postfach zu senden ;)

Nein, diese werden dann per DHL an Packstation verschickt - wobei 3x3 Meter im Grunde fast schon Speditionskandidaten sind. :)

Zitat:

Zitat von Catbytes
Aber ich glaube wir werden langsam OT :mrgreen:

Ja, fürchte ich auch. :lol:

Piethan 3. Jun 2009 15:45

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jürgen Thomas,

Danke für deine Prozedure. Ich habe diese für mein Programm in eine Funktion gepackt und mit
einen Rückgabetypen TAdresse = record versehen.


LG
Dirk

Delphi-Quellcode:
{
Diese Unit lehnt sich an den Beitrag von Jürgen Thomas an. Ich habe
diese Funktion eigentlich nur um einen eigenen Rückgabetypen
TAdresse erweitert und in eine eigene Unit gepackt. Daher
Danke an Jürgen Thomas.

Quelle : [url]http://www.delphipraxis.net/topic88990,0,asc,0.html[/url]

Dirk Piethan
03.06.2009
}


unit minitools;
interface

uses SysUtils;


type TAdresse = record
  STRASSE : STRING;
  HAUSNUMMER : INTEGER;
  ZUSATZ : STRING;
  POSTFACH : STRING;
end;

function Strasse_to_Details( sQuelle: string): TAdresse;

implementation
function Strasse_to_Details( sQuelle: string): TAdresse;
var
c0: char;
s0, s1, s2: string; i0, iNrLaenge: integer;
bNummer: boolean;
sStrasse: string;
iNr: integer;
sZusatz: string;
sPostfach: string;
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);
    Result.STRASSE:=sStrasse;
    Result.HAUSNUMMER:=iNr;
    Result.ZUSATZ:=sZusatz;
    Result.POSTFACH:=sPostfach;
  end;
end;
end.

Kalfany 3. Jun 2009 15:59

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
[OT]
Zitat:

Zitat von pumpe
Feld:Strasse
...
Brunnwiese 18 b
Wasserburgr Str. 14
Chiemseestr. 23

Th.-Körner-Str3
...

Ich trau mir wetten das ich weiß zu welcher PLZ die 3 gehören (und wenn ich mich nicht irre müssten an allen 3 Adressen Gaststätten sein) :cheers: :mrgreen:
[/OT]

mjustin 3. Jun 2009 16:48

Re: Strassenname, Hausnummer und Zusatz trennen!?
 
Es gibt in manchen Gemeinden auch Hausnummern wie z.B. 4 1/2 oder 5 3/4 (quasi "dazwischengebaut"). Oder 12-16.

:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr.

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