SASで単換字式暗号(ROT13)


はじめに

本投稿の内容は、前回投稿した Rで単換字式暗号(ROT13) のSASバージョンです。
ROT13についての説明は上記の記事で説明しているため、割愛させていただきます。
使用しているのは、無料のSAS University Editionです。

SASでコーディング

以下は作成したROT13暗号化の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 でマクロ変数として定義しています。

Example01.sas
data result;
    set sample;
    %ROT13(AA, BB);
run;

実行結果

作成したROT13マクロの使用例と実行結果です。
変数Beforeの文字列のうち、アルファベットのみが(大文字小文字を区別して)変換されて変数Afterに出力されます。

Example02.sas
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;