LoginSignup
0
0

More than 5 years have passed since last update.

SASで単換字式暗号(ROT13)

Posted at

はじめに

本投稿の内容は、前回投稿した 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です。
各マクロ変数に格納される値はこちら。


mROT13_mvarLog.png


最後に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;

mROT13_Result.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0