Ergebnis 1 bis 10 von 10

Thema: Aus einem String den ersten Eintrag entfernen

  1. #1
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard Aus einem String den ersten Eintrag entfernen

    Salut

    Folgendes Problem:
    Ich versuch gerade einen Addressnormalizer für nen Geocoder zu programmieren.
    Der Input ist ein gewöhnlicher Addressstring (z.B. Teststrasse 2 9543 Testort Badenwürtenberg).

    Was ich bereits geschafft hab, ist den Strassennamen herauszufinden.

    Nun will ich den Strassennamen vom Inputstring entfernen/wegnehmen.
    So das der String nur noch folgendermassen aussieht: 2 9543 Testort Badenwürtenberg

    Hab bisher keine geeignete Lösung gefunden.

    Gruss

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Gegenfrage: wie willst du die Straßen in Mannheim damit bearbeiten? ;-)

    Die sehen ungefähr so aus: "L2/3" ...


    P.S.: Wir haben mittlerweile seit 16 Jahren 5-stellige Postleitzahlen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Salut

    Folgendes Problem:
    Ich versuch gerade einen Addressnormalizer für nen Geocoder zu programmieren.
    Der Input ist ein gewöhnlicher Addressstring (z.B. Teststrasse 2 9543 Testort Badenwürtenberg).

    Was ich bereits geschafft hab, ist den Strassennamen herauszufinden.

    Nun will ich den Strassennamen vom Inputstring entfernen/wegnehmen.
    So das der String nur noch folgendermassen aussieht: 2 9543 Testort Badenwürtenberg

    Hab bisher keine geeignete Lösung gefunden.

    Gruss
    Code:
    test=*# select substring('Teststrasse 2 9543 Testort Badenwürtenberg', strpos('Teststrasse 2 9543 Testort Badenwürtenberg',' ')+1);
               substring
    --------------------------------
     2 9543 Testort Badenwürtenberg
    (1 Zeile)
    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Gegenfrage: wie willst du die Straßen in Mannheim damit bearbeiten? ;-)

    Die sehen ungefähr so aus: "L2/3" ...


    P.S.: Wir haben mittlerweile seit 16 Jahren 5-stellige Postleitzahlen.
    Absolut korrekte Einwände. Meine Demo wird für den gestellten Sonderfall arbeiten, nicht aber für alle Datensätze. Wenn das so *zensiert* erfaßt wurde, hilft wohl nur, die *zensiert* zu entsorgen ...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Was heißt erfasst ... man kann Straßenbezeichnungen irgendwie in kein Muster quetschen. Da gibt es 1000und1 Sonderfall.
    Ich würde an der Stelle auch nicht mit SQL arbeiten sondern die Daten mit irgendeiner Skriptsprache auseinandernehmen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  6. #6
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    Klappt wie geschmiert.

    Danke Andreas

  7. #7
    user unknown ist offline Neuer Benutzer
    Registriert seit
    23.04.2008
    Ort
    Berlin
    Beiträge
    18

    Standard

    Mit regulären Ausdrücken könnte man sich der Sache durchaus nähern. Um der Überschrift zu genügen, und wirklich den ersten Eintrag zu extrahieren, sprich bis zum ersten Blank bei folgenden Testdaten abzuschneiden:

    select str from kunde;
    str
    ----------------------------------
    Am Weidenweg 49, 19434 Potsblitz
    Löwenhardtdamm 17 10829 Berlin
    In der Au 9 44332 Biesdorf
    Haus Alpenglühn 88888 Bergdorf

    Code:
    SELECT regexp_replace (str, '([^ ]*) .*', E'\\1') as part1,  regexp_replace (str, '[^ ]* (.*)', E'\\1') as part2 FROM kunde; 
         part1      |             part2             
    ----------------+-------------------------------
     Am             | Weidenweg 49, 19434 Potsblitz
     Löwenhardtdamm | 17 10829 Berlin
     In             | der Au 9 44332 Biesdorf
     Haus           | Alpenglühn 88888 Bergdorf
    Die Testdaten sind absichtlich etwas fies gewählt, aber in den Alpendörfern sind Häuser ohne Straßenname, wo es aber Hausnamen gibt, möglich. Dafür habe ich keine Mannheimer Straßen aufgeführt, da ich die dortigen Gepflogenheiten nicht kenne.

    Eher würde ich aber versuchen vor der Postleitzahl zu trennen:
    Code:
    SELECT regexp_replace (str, '([^ ]*) [0-9]{5}.*', E'\\1') as part1,  regexp_replace (str, '.* ([0-9]{5}.*)', E'\\1') as part2 FROM kunde; 
           part1       |      part2      
    -------------------+-----------------
     Am Weidenweg 49,  | 19434 Potsblitz
     Löwenhardtdamm 17 | 10829 Berlin
     In der Au 9       | 44332 Biesdorf
     Haus Alpenglühn   | 88888 Bergdorf
    HIer ist jetzt jeweils die Hausnummer Teil von Part 1, was sich noch ändern ließe, in dem man den Text vor der Postleitzahl mit auf die rechte Seite zieht.

    Wenn die Schreibweisen für Hausnummern wie in 17-23, 4a usw. immer einheitlich wären wäre das wohl kein Problem, aber wenn manche Einträge wieder 17 - 23 oder 4 a lauteten, wäre auch entsprechend mehr nachzuarbeiten.

  8. #8
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    Dank eurer Hilfe bin ich schon sehr viel weiter gekommen.
    Mein Normalizer extrahiert HNr, Strassenname, PLZ und das Land vom Ende des Strings.

    Nun hab ich das Problem, dass Länder zum Teil aus mehreren Wörtern bestehen.
    z.B. British Indian Ocean Territory
    Mit Hilfe des Soundex Algorithmus hab ichs geschafft die Länder anhand einer Lookup-Tabelle zu identifizieren.

    Nun bräuchte ich jedoch wieder etwas Hilfe.

    Ich würde gerne aus dem Inputstring das Land am Ende entfernen. Zuerst werden die Anzahl Wörter des Landes gezählt (Dafür hab ich bereits eine Funktion) und anhand der Anzahl vom Orginalstring entfernt.

    Z.B Teststrasse 2 23456 Teststadt British Indian Ocean Territory
    Count_word = 4
    Code: ?????
    Resultat: Teststrasse 2 23456 Teststadt

    Greets

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Wie wäre es an der Stelle, dann doch mal auf eine Skriptsprache zu wechseln? Perl und Python (und noch ein paar) stehen auch als serverseitige Sprachen zur Verfügung.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    So kurz vor dem Ziel die Sprache wechseln?????

    Es braucht nicht mehr viel und ich bin am Ziel....

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum