LesezeichenAbonnierenRSS-Feed abonnieren
SMartin
Calcite | Level 5

Hallo zusammen,

ich habe eine Variable in der Strasse und Hausnummer zusammen drin stehen. Ich würde diese gern in zwei Variablen trennen

data example;

input street_number $30.;

datalines;

Limburger Str. 15a

Genter Str. 1

Schanzenstrasse 12 b

Hollunder Weg 92

;

run;

Ich suche quasi nach einer Funktion der ich sagen kann: sobald die erste Stelle eine Zahl ist - trenne diese in neue Variable.

Street                      Number

Limburger Str.           15a

Genter Str.               1

Schanzenstrasse      12 b

Hollunder Weg          92

Ich habe an substr() und scan() gedacht, aber meine Internetsuche war leider bisher sehr erfolglos... Ich freue mich über Denkanstöße und eure Unterstützung!

Viele Grüße

Silke

10 ANTWORTEN 10
AndiWindisch
Calcite | Level 5

Hallo Silke,

ich würde vorschlagen, dass mal mit den Perl Regular Expression (RegEx) zu versuchen.
Die Problemstellung gibt ja keinen festen Trennpunkt her, also muss man sich diesen ermitteln.

Der reguläre Ausdruck (\d) sucht nach einem numerischen Wert, die Funktion PRXMATCH gibt die erste Position zurück.

data example;

    input street_number $30.;

datalines;

Limburger Str. 15a

Genter Str. 1

Schanzenstrasse 12 b

Hollunder Weg 92

;

run;

data _text(Drop=_sta _len);

    set example;

    _sta = prxmatch("/\d/",street_number);

    _len = length(street_number) - _sta;

    street = substr(street_number, 1, _sta - 1);

    street_no = substr(street_number, _sta, _len+1 );

run;

Ergebnis:

2015-04-15 12_43_39-Screenshot.jpg

Viele Grüße

Andreas

P.S. Informationen findet man auch in dem Perl Regular Expressions Tip Sheet

ebecker
Nicht anwendbar

In dem Falle sollte es auch mit SAS gehen.

Ich finde RegEx nicht gerade eingängig 😉

_sta = indexc(street_number,'0123456789');

Ich habe gerade kein SAS hier, evtl. muss man noch etwas probieren wenn es keine Ziffer gibt.

Eckhard

grimol
Calcite | Level 5

eine 100%-Lösung gibt's leider nicht (immer). Gutes Beispiel zum testen "Straße des 8. März 99b" Smiley (zwinkernd)

grimol
Calcite | Level 5

Falls irgendwann mal meine Antwort vom Moderator freigegeben wurde: Doppelposting da es hier wohl eine ganze weile dauert, bis alle Posts zu lesen sind...

jakarman
Barite | Level 11

Denn nicht from links nach rechts arbeiten aber vom rechts nach links.  Dass macht ein mensch auch.    

---->-- ja karman --<-----
Kurt_Bremser
Super User

Man kann nicht nur nach numerisch/alphanumerisch trennen. Es gibt auch Hausnummern wie 14a, oder Stiege III. Das torpediert dann auch die Vorgangsweise von rechts.

Ich glaube nicht, dass man das maschinell mit 100% Zuverlässigkeit machen kann.

SMartin
Calcite | Level 5

Danke schön! Hat prima geklappt!

Viele Grüße,

Silke

Benno_Burkhart
Calcite | Level 5

Hallo Silke,

also ich habe in meinen Daten eine Trefferwahrscheinlichkeit von 99,87 %.

Eine Hausnummer beginnt ab der ersten Ziffer im String (1).

Dann prüfe ich die Hausnummer bis zum vorletzten Zeichen (2). Das letzte Zeichen ist mir egal.

Kommt nur noch ein 'und' vor, dann ist es ok (3).

Kommt nur noch ein 'bis' vor, dann ist es auch ok (4).

Sonst gebe ich auf und der ganze Text wird Straße (5).

Als Sonderzeichen habe ich nur den Bindestrich und Leerzeichen, aber die sind natürlich ok.

     length STRASSE MYSTRASSE MYHAUSNR $60 HAUSNR $10 FALL 8;

     /* Wir droeseln Strasse und Hausnummer auf: */
     if anydigit (ADDRESS_LINE_1_TXT) then do;
        MYSTRASSE = substr (ADDRESS_LINE_1_TXT, 1, anydigit (ADDRESS_LINE_1_TXT) - 1);

/* ad (1): */
        MYHAUSNR = substr (ADDRESS_LINE_1_TXT, anydigit (ADDRESS_LINE_1_TXT));

        /* Kommt noch eine Information nach der Hausnummer? */

/* ad (2): */
        if anyalpha (substr (left (reverse (MYHAUSNR)), 2)) then do;
           /* und und bis lassen wir so:*/

/* ad (3): */
           if not anyalpha (tranwrd (lowcase (MYHAUSNR), 'und', ' ')) then FALL = 1;

/* ad (4): */
           else if not anyalpha (tranwrd (lowcase (MYHAUSNR), 'bis', ' ')) then FALL = 1;
           /* sonst geben wir auf: */
           else FALL = 2;
        end;
        else do;
           FALL = 1;
        end;
     end;
     else FALL = 2;

/* ad (5): */

     if FALL = 2 then STRASSE = ADDRESS_LINE_1_TXT;
     else do; /* Fall = 1 */
        HAUSNR = MYHAUSNR;
        STRASSE = MYSTRASSE;
     end;

Gruß

Benno

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Diskussionsstatistiken
  • 10 Antworten
  • 5090 Aufrufe
  • 1 Kudo
  • 7 in Unterhaltung