subpad関数はもう少し使われてもよさそうだけどもって話

substr関数を使って、特定の文字数で変数を分割したいなってときがあったとします。
3文字ごとに3つの変数にわけようと思って、以下のコードを書いたとします。

data b;
set a;
x1=substr(x,1,3);
x2=substr(x,4,3);
x3=substr(x,7,3);
run;

ところが流し込むデータを受け取ってみると、こんな感じでした。

data a;
x="1234";output;
run;

先のコードをデータセットaに対して実行すると





となり、結果は正しいのですが






ログにノートがでます。
xのlengthが4のため、4文字目から3文字とれと言われても
はみ出てるやんっていうメッセージです。
同様の理由で7文字目はそもそもないのでメッセージがでます。

まあ、理由も明確に説明できるので
いいちゃいいかもしれませんが、理想としてはログにこういうのは極力だしたくないし
_ERROR_=1たつのはやはり健全ではない。

この場合においては、subpad関数が有効で、はみ出た分は自動的に空白で埋めて
ログには何もださない。SASによる説明に少し補足すると
「必要に応じて空白埋め込みを使用し、(第3引数で)指定した長さの部分文字列を返します。」

書き方はsubstrと同じで以下になる。

data c;
set a;
x1=subpad(x,1,3);
x2=subpad(x,4,3);
x3=subpad(x,7,3);
run;

ただし、要注意なのがsubstr変数が作るx1 x2 x3のlengthは
もとの変数xのlengthが引き継がれますが
subpad関数で作成される変数は文字変数戻りのデフォである
$200.になるのでそこは要注意です。

substrなら、性質上、元の変数のlengthを引き継いでおけば生成される変数で内部の値が
それを超えることはありえないので文字切れはないですが、subpadの場合、
 x1=subpad(x,1,300);などとした場合201-300文字は切れることになります。

ただ、その場合は親切設計で



とわかりやすくですので、ログを全く見ないアンポンタン以外は、まず気づけるはず。

割といい関数だけど、存在をよく忘れてしまう






0 件のコメント:

コメントを投稿