Einzelnen Beitrag anzeigen

Jürgen Thomas

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

Re: Strassenname, Hausnummer und Zusatz trennen!?

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