![]() |
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 |
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; |
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? |
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 |
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. |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Hi,
aufpassen bei ausländischen Adressen! In Frankreich schreibt man IMHO: Nummer, Straße |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Genau das ist das richtige Verfahren (so habe ich es seit 1986 mehrfach gemacht):
Zitat:
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:
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:
Delphi-Quellcode:
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.
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; Jürgen |
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:
Grundsätzlich arbeiten beide Funktionen recht ähnlich. Ein Beispiel:
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; 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:
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...
maxdepth: Byte = 4;
|
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: |
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 ! |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Hallo,
hier ist noch ein Thread der sich mit dem gleichen Thema beschäftigt hat. ![]() Grüße Klaus |
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:
|
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: ![]() Und zum suchen empfehle ich ![]() |
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 |
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 |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Zitat:
"Normale" Postadressen sind was anderes wie Lieferadressen... |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Zitat:
Bis dann. |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Zitat:
Aber ich glaube wir werden langsam OT :mrgreen: |
Re: Strassenname, Hausnummer und Zusatz trennen!?
Zitat:
Zitat:
|
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. |
Re: Strassenname, Hausnummer und Zusatz trennen!?
[OT]
Zitat:
[/OT] |
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 17:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz