SAS 入力方式 $CHARw. VS $w.

入力方式 $CHARw. と $w. は文字を取り込むときに使う入力方式です(w には変数の長さが入ります)。 同じ意味の入力方式かと思いきや、少し動作が異なります。

$CHARw. は、一文字のドット . をきちんと読み込みますが、$w. は読み込まず欠損値となります。

また、頭と末に空白があった場合の動作も、若干異なります。


$CHARw. と $w. の動作の違いを確かめるテストコード

data TEST ;
  infile cards dlm="," dsd missover ;
  input STR_1 : $char10.
        STR_2 : $10.
        ;
  LEN_1 = length(STR_1) ;
  LEN_2 = length(STR_2) ;

cards ;
ABC,DEF
.,.
..,..
 BC, EF
"BC ","EF "
" A B C "," D E F "
;
run ;


proc print data=TEST ;
run ;


OBS STR_1 STR_2 LEN_1 LEN_2
1 ABC DEF 3 3
2 . 1 1
3 .. .. 2 2
4 BC EF 3 2
5 BC EF 2 2
6 A B C D E F 6 5

一文字のドットがある場合、$CHARw. はそのまま取り込めているのがわかります。$w. は欠損値となっています。

頭と末の空白については、見た目上はわからないですが、length 関数の値が異なる場合があるのがわかります。どうやら、先頭の空白の有無で違いが現れているようで、末の空白は違いがないようです。(ただし、頭と末の空白の扱い方は、windows と unix やら環境で違いがあるっぽいので、必ずしも同じ結果になるかは未確認です。。。)


もし一文字のドットを意味ある文字として使いたい場合があれば、、、 $CHARw. と $w. はきちんと使い分けないといけないよ、という話でした。

ちなみに、出力方式の $CHARw. と $w. には違いがないようです。

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意