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
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:
Viele Grüße
Andreas
P.S. Informationen findet man auch in dem Perl Regular Expressions Tip Sheet
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
eine 100%-Lösung gibt's leider nicht (immer). Gutes Beispiel zum testen "Straße des 8. März 99b"
Noch besser: "5. Haidequerstrasse". Und wer sich wundert, obs sowas gibt: Wien - Simmering.
Das Ganze schlägt dann fehl bei "Strasse des 1. Mai"
Falls irgendwann mal meine Antwort vom Moderator freigegeben wurde: Doppelposting da es hier wohl eine ganze weile dauert, bis alle Posts zu lesen sind...
Denn nicht from links nach rechts arbeiten aber vom rechts nach links. Dass macht ein mensch auch.
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.
Danke schön! Hat prima geklappt!
Viele Grüße,
Silke
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 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!