Fallen bei der Unicode-Unterstützung durch SAS-Base/-Macro

Hallo zusammen,
die Unicode-Unterstützung in SAS-92 ist immer wieder für Überraschungen gut.
Kürzlich änderte ich ein vorhandenes Stück Code und dabei stellte ich dieses Stück Code auch auf die K-Funktionen um.
Info: Die K-Funktionen in SAS-Base und SAS-Macro (z.B. %ksubstr statt %substr bzw. kupcase statt upcase) machen den Base- und Macro-Code unicode-fähig.

Die Falle war die %klength()-Macro-Funktion. Sie sollte die Länge eines schwierigen Textes liefern, so wie es die %length()-Macro-Funktion schon seit langer Zeit (fehlerfrei) tat:

%let TestStr=das ist ein Test, der klappt;
%put INFO: TestStr=&TestStr.;

%let LaeTestStr=%length(&TestStr.);
%put INFO: LaeTestStr=&LaeTestStr.;

Leider ist die %klength()-Funktion nicht so Komma-tolerant:

%let TestStr=das ist ein Test, der nicht klappt;
%put INFO: TestStr=&TestStr.;

%let kLaeTestStr=%klength(&TestStr.);
%put INFO: kLaeTestStr=&kLaeTestStr.;

liefert häßliche Fehler:

4188 %let TestStr=das ist ein Test, der nicht klappt;
4189 %put INFO: TestStr=&TestStr.;
INFO: TestStr=das ist ein Test, der nicht klappt
4190
4191 %let kLaeTestStr=%klength(&TestStr.);
ERROR: Macro function %KLENGTH has too many arguments. The excess arguments will beignored.
4192 %put INFO: kLaeTestStr=&kLaeTestStr.;
INFO: kLaeTestStr=16

Das ist eine sehr doofe Sache, nach der Unicode-Umstellung mit Hilfe eines großzügigen automatischen Edit->Replace hat man das große Risiko, dass ein ehemals korrekter Code nicht mehr korrekt läuft und Fehler und Abstürze produziert.

Das Problem ist bei SAS (mittlerweile) bekannt und wird mit einer nächsten Version (entweder kleiner Update M4 oder großerer Update 9.3) behoben. Bis dahin hilft nur %bquote():

%let TestStr=das ist ein Test, der wieder klappt;
%put INFO: TestStr=&TestStr.;

%let kLaeTestStr=%klength(%bquote(&TestStr.));
%put INFO: kLaeTestStr=&kLaeTestStr.;

Aber das lässt sich nicht so einfach automatisch mit Edit->Replace erledigen.
Wieder einmal gilt:
Aus den (Un-)Tiefen der Unicode-Praxis
grüßt
Hans Kneilmann, Schäfer Shop GmbH (SSI)

P.S.:
Die Geschichte ging los mit Unicode, Code-Umstellung und Flat Files, die Fortsetzung war in Unicode-Umstellung, Code-Umstellung.

Klength2

Hallo Herr Kneilmann,

als Workaround können Sie das folgende kleines Makro nutzen:

%macro klength2() /parmbuff ;
%length(%bquote(&syspbuff.))
%mend ;

dann können Sie Ihren Code per Replace anpassen.

Gruß
Lutz Ritter

Gute Idee

Hallo Herr Ritter,
der Workaround ist eine gute Idee, so einfach wenn man weiß wie es geht.
Es ging mir in meinem Beitrag nicht nur um die Lösung eines aktuellen Problems, sondern auch um die Warnung an alle anderen Vorsicht Falle!

Zusammen mit dem Workaround ist es natürlich perfekt.
Der Workaround müßte so aussehen, sonst ist er sinnlos:

%macro klength2() /parmbuff ;
%Klength(%bquote(&syspbuff.))
%mend ;

Die parmbuff-Option und die Macro-Variable syspbuff kannte ich noch nicht.
Wie war der passende Spruch: Man wird alt wie 'ne Kuh und lernt immer noch dazu! :-)

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)