2016年8月24日水曜日

PUTステートメントで、変数値の先頭スペースが消えてしまう




以前いただいた質問です。以下の例をご覧ください。

*** サンプルデータ ;
data DT1;
  A="aaaaa"; output;
  A="  bbb"; output;
  A="  ccc"; output;
run;

  A  
aaaaa 
  bbb 
  ccc



上の例で2~3行目の変数値の先頭には半角スペースがあります。
これを以下のようにPUTでログに出力してみると、、

*** 変数Aをログに吐いてみる ;
data DT2;
    set DT1;
    put A;
run;

ログ
aaaaa
bbb
ccc

先頭の半角スペースが消えてしまいます。このスペースを残すにはどうしたら良いでしょうか?



解決案

data DT2;
   set DT1;
   BLANK = kverify(A," ")-1;
   put +BLANK A;
run;



解説
「KVERIFY関数」と 「カラムポインタコントロール機能」 を使ってみました。
(KVERIFYについては以下記事で紹介しているので参照下さい)
・ VERIFY(KVERIFY)関数の紹介


① まずKVERIFYで半角スペース以外の文字が最初に出現する位置-1を変数BLANKに格納。
   BLANK = kverify(A," ")-1;



② PUTステートメントで 「+変数」 とすると、指定した変数に格納されている数値分だけポインタを移動させてくれます。
つまり変数Aの先頭スペースの分だけ右にポイントを移動させてから、Aの値を出力しています。
   put +BLANK A;




2 件のコメント:

  1. すみません、SASYAMAさんのコメント編集ミスで消してしまいました。
    元のコメント貼り付けます。。

    ------------------------------------
    SASYAMA2016年8月24日 13:44
    どうもです。おぉ、+に変数指定できたんすね!
    けど、このケースなら$charフォーマットあてて出す方が簡単じゃないでしょうか?
    data DT2;
    set DT1;
    put A $char.;
    run;


    ------------------------------------
    SASYAMAさん、どうもです!

    ちょっと記事の例がわるかったです。。実際質問をもらったのが、
    「テキストファイルに吐いたり、DDEでEXCELに吐く場合、先頭スペース出すにはどうすればよい?」
    というものでした。

    そこで以下のようにLENGTHがあてられた変数に対して$charをつかって吐くと、後ろにスペースが出来ちゃうんですが、この後ろブランクって取る事できるんでしょうか?

    data DT1;
    length A $10.;
    A="aaaaa"; output;
    A=" bbb"; output;
    A=" ccc"; output;
    run;


    filename test "適当なパス\test.txt";
    data DT2;
    set DT1;
    file test;
    put A $char. ;
    run;

    かといって今回の記事の方法は一手間かけてるし、もっとスマートな方法ないですかねー。

    返信削除
  2. なるほど~、外部出力の場合でしたか!
    確かに$charだと後ろにブランクになりますね、しかも多分とれないと思います。
    matsuさんの方法がベストなのかもですね。
    なんか、こういうちょっとしたことが一番解決しにくいですよね。

    それはそうとproc document面白いですね!楽しみにしてます!!

    返信削除