はじめに
本投稿の内容は、前回投稿した Rで単換字式暗号(ROT13) のSASバージョンです。
ROT13についての説明は上記の記事で説明しているため、割愛させていただきます。
使用しているのは、無料のSAS University Editionです。
SASでコーディング
以下は作成したROT13暗号化のSASマクロです。
%macro ROT13(tgt_var, out_var);
%let bfLine = ABCDEFGHIJKLMNOPQRSTUVWXYZ;
%let afLine = %sysfunc(substr(&bfLine., 14, 13))%sysfunc(substr(&bfLine., 1, 13));
%let bfVals = &afLine.%sysfunc(lowcase(&afLine.));
%let afVals = &bfLine.%sysfunc(lowcase(&bfLine.));
&out_var. = translate(&tgt_var., "&bfVals.", "&afVals.");
%mend ROT13;
マクロ内での処理内容
処理自体はアルファベットを13文字ズラした文字に置き換えているだけです。
ただし、Rと異なり、SASにはアルファベット26文字を出力する関数がないため、%let bfLine = ABCDEFGHIJKLMNOPQRSTUVWXYZ;
としています。変数bfLine
の各アルファベットをを13文字ズラした変数がafLine
。
変数bfLine
, afLine
に小文字化したアルファベットを追加で結合した変数がbfVals
, afVals
です。
各マクロ変数に格納される値はこちら。
最後にtranslate関数で指定の変数のアルファベットを変換し、指定の変数に出力します。
上記の処理はデータステップでも可能ですが、以下のような、関数的な用い方をするために、各変数を %let
でマクロ変数として定義しています。
data result;
set sample;
%ROT13(AA, BB);
run;
実行結果
作成したROT13マクロの使用例と実行結果です。
変数Before
の文字列のうち、アルファベットのみが(大文字小文字を区別して)変換されて変数After
に出力されます。
data sample;
length Before $15.;
Before = "Hello World!"; output;
Before = "Stack Overflow"; output;
Before = "1234567890"; output;
Before = "あいうえお"; output;
run;
data result;
set sample;
%ROT13(Before, After);
run;