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