AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Strassenname, Hausnummer und Zusatz trennen!?

Strassenname, Hausnummer und Zusatz trennen!?

Ein Thema von pumpe · begonnen am 1. Aug 2006 · letzter Beitrag vom 3. Jun 2009
Antwort Antwort
Seite 1 von 3  1 23   
pumpe

Registriert seit: 30. Mär 2006
Ort: Neubrandenburg
8 Beiträge
 
#1

Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:03
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:19
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;
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:23
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?
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:33
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
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
pumpe

Registriert seit: 30. Mär 2006
Ort: Neubrandenburg
8 Beiträge
 
#5

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:39
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 Ihr müsst mir jetzt auch nich den Code hinschreiben nur einmal anstossen von hinten.
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#6

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 08:50
Hi,

aufpassen bei ausländischen Adressen!

In Frankreich schreibt man IMHO: Nummer, Straße
Catbytes
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#7

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 09:10
Genau das ist das richtige Verfahren (so habe ich es seit 1986 mehrfach gemacht):
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 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 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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
moonwhaler

Registriert seit: 22. Dez 2005
57 Beiträge
 
Delphi 5 Enterprise
 
#8

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 09:23
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:

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...
  Mit Zitat antworten Zitat
pumpe

Registriert seit: 30. Mär 2006
Ort: Neubrandenburg
8 Beiträge
 
#9

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 09:44
Super danke euch. Im Groben haut es schon hin, nur noch ein bißchen feintuning!

Seid echt Klasse Team hier!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

Re: Strassenname, Hausnummer und Zusatz trennen!?

  Alt 1. Aug 2006, 09:55
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. 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 !
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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