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. には違いがないようです。
コメント
コメントを投稿