Zeichen löschen
Verfasst von HansKneilmann am 18 Dezember, 2009 - 12:55
Hallo zusammen,
ich suche eine elegante Möglichkeit aus einer Char-Variable alle schlechten Zeichen rauszulöschen. Also nur die guten Zeichen übrigzulassen, also nur a-z, A-Z, 0-9 (ggf. auch den _) zuzulassen.
data aaa;
string1="4decors@busmail.net";
string2=compress(translate(string1, " ", "abcdefghijklmnopqrstuvwxyz0123456789"));
put string1= string2=;
run;
string1="4decors@busmail.net";
string2=compress(translate(string1, " ", "abcdefghijklmnopqrstuvwxyz0123456789"));
put string1= string2=;
run;
Leider ist diese Lösung genau verkehrt herum. Sie löscht alle guten Zeichen raus und läßt die schlechten Zeichen übrig ....
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Wie wäre es denn hiermit...
RegExpId=prxparse('s/\W//');
string1="4decors@busmail.net";
call prxchange(RegExpId, -1, string1);
put string1;
run;
Das Ergebnis lautet "4decorsbusmailnet" Also alle gute Zeichen sind drin.
\W findet alle Zeichen außer non-word character, nonalphanumeric character, und entfernt das _
Also bleiben alle guten Zeichen enthalten!!!
Grüße
Niko
Geht auch mit compress
Hallo Herr Kneilmann,
die Funktion compress hat noch zwei weitere Parameter.
string1="4Decors@busmail.net";
string2=compress(string1,,"NK");
put string1=;
put string2=; /*Englische Zeichen, Zahlen, Unterstrich)*/
run;
Im zweiten Parameter kann man eine Liste von Buchstaben definieren, so wie Sie es bei Translate gemacht haben. Im dritten Parameter kann man ganze Gruppen von Zeichen hinzufügen.
N steht für alle englischen Buchstaben, Zahlen und den Unterstrich.
K sorgt dafür, dass die Zeichen der Liste nicht entfernt sondern behalten werden.
\W in der Funktion PRXChange entfernt nicht den Unterstrich.
Falls der Unterstrich ein Problem ist, kann man
string1="4Deco_rs@busmail.net";
string2=compress(compress(string1,,"NK"),"_");
string3=prxchange("s/[^a-zA-Z0-9]//",-1,string1);
put string1=;
put string2=; /*Englische Zeichen, Zahlen */
put string3=; /*Englische Zeichen, Zahlen */
run;
schreiben.
Schöne Grüße
Jan
Stimmt!
Hi Jan,
wie es aussieht habe ich mal wieder zu schnell über die Hilfe gelesen und auch nicht passend getestet...Mit "exclude the underscore" wird das Zeichen einfach ignoriert anstatt, wie ich dachte, es wird explizit entfernt!
Tables of Perl Regular Expression (PRX) Metacharacters
Jedenfalls hast du Recht. Danke!
Grüße
Niko
Danke!
Hallo,
danke für die Lösungen.
Das die
compress-Funktion mehr kann als nur Leerzeichen löschen vergesse ich immer wieder ....Vieleicht bleibt es jetzt hängen :-)
Die Lösung mit den regulären Ausdrücken ist super!
Mit den neuen PRX-Funktionen bin ich noch nicht so ganz vertraut, mir war das die ganze Zeit zu umständlich mit dem
RegExpId=prxparse();bzw. demif _N_ eq 1 then RegExpId=prxparse();.Die direkte Variante
prxchange("s/[^a-zA-Z0-9]//",-1,string1);ist mir da schon viel sympatischer (und als altem Unix-Shell-Scipter auch vetrauter).Danke und Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)
Hallo Herr Kneilmann, SAS
Hallo Herr Kneilmann,
SAS schreibt dazu in der Hilfe:
If perl-regular-expression is a constant or if it uses the /o option, the Perl regular expression is compiled only once. Successive calls to PRXPARSE will not cause a recompile, but will return the regular-expression-id for the regular expression that was already compiled. This behavior simplifies the code because you do not need to use an initialization block (IF _N_ =1) to initialize Perl regular expressions.
Dieses Verhalten gilt für alle PRX-Funktionen.
Schöne Grüße
Jan
Noch mal danke
Hallo Jan,
das vereinfacht wirklich den Code. Dafür noch mal Danke. Diese Info ist echt hilfreich. Manchmal machen sich fehlende Release-Wechsel-Kurse doch bemerkbar ...
Gruß
Hans