【SAS/プログラミング】compress,trim,sprit~空白を考えるということは無を知るということだ。
今回は、文字型変数の空白(ブランク)の取り除き方についての、説明です。
SASのバージョンが上がってもしかしたら自然と解消されているのかもですが、作業時に、文字型変数を代入、結合、修正などで取り扱う場合、
ブランクが入ることがあり、適切に値が入らず、つまずくことがあります。
『あれ?なんか変数の間に空白がある!』、『値がブランクだけどなんで?』『前の値はちゃんと入っているのに・・・・。』
その悩み、変数に空白が入っている可能性があります!ドドン!(かっこ良く記載しておりますが、単に空白を取り除く方法です(笑))
※ここでは「空白」と「ブランク」が出ておりますが、どちらも同じ意味です。
空白ができる原因
例えば、以下のようなプログラムを記述したとします。
/* program code 01 */
data test1;
length a $10. b $5.;
a="aaaaa";
b="bbbbb";
c = cat(a,b); /* 結合例1 */
d = a||b; /* 結合例2 */
run;
<実行結果>
変数aとbを結合させて”aaaaabbbbb”と出力したい!としたい場合、
上記のようにc = cat(a,b); もしくはc = a||b;と記述すると、
変数aとbの間に空白(ブランク)が発生します。
ちなみに変数cは長さが200になりました。変数dは長さが15となります。
代入の仕方によって長さも変わるようです。
空白ができる原因としては、以下に記載がありました。
https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/ba061.html
長さに満たない文字が入っていた場合、結合させたら長さ分の空白(ブランク)を入れていることが原因のようです。たとえば上記のA変数の長さ10とした場合、”aaaaa”は5文字、長さが10の変数Aでは、余裕ができた分がブランクになります。ただ、長さ10で“aaaaa”は5文字だから5つブランクがある訳でもなさそうです。
なので逆に5文字分、空白を入れたい場合は、別に設定する必要があります。今回はあくまでも空白を取り除くということに着目したいと思います。
空白を取り除く関数紹介
その空白を取り除く代表的な関数を3つ紹介します。
・COMPRESS関数
対象変数にある対象の1文字を取り除く。
Compress(対象変数,”取り除きたい文字”)
こちらは変数にあるすべての1文字を消去します。こちらは1文字のみとなります。
/* program code 02 */
data test2;
WD = "My Name is GENSAN";
WD_OUT = compress(WD," ");
run;
<出力結果>
上記のとおり、すべての空白(ブランク)が消えました。
・TRIM関数
対象変数の末尾にある空白(ブランク)を取り除く。
Trim(対象変数)
/* program code 03 */
data test3;
length WD $100. WD2 $3.;
WD = "My Name is GEN"; WD2="SAN";
WD_OUT = trim(WD)||WD2;
run;
<出力結果>
出力した変数WD_OUTの長さは103となります。
ちなみに以前は、Trim(Left(変数名))を使用しておりました時期もありました。表記がセンタリングされてしまう問題があったこともあり、空白を取り除いた上で左寄せをする処理をしておりました。
・STRIP関数
対象変数の先頭と末尾にある空白を取り除く。
Strip(対象変数)
/* program code 04 */
data test4;
length WD $100.;
WD = " My Name is GEN ";
WD_OUT = strip(WD);
run;
<出力結果>
上記の画像だとわかりにくいかもですが、変数WDの前にちゃんとブランクがあります。そして変数WD_OUTにはブランクがMyの前にはブランクがありません。ちなみに後ろのブランクは表示されないので変数WD、WD_OUTともに見えません。変数WDを結合させるときなどのブランクが登場します。
まとめ
最近はSASもバージョンが上がっているので、今回のは補足っぽい感じかもしれませんが、文字型変数の場合で、前の記述があっているのに変数に値が入らないなら、一度上記の方法でブランクを取り除く作業をしてはどうでしょうか。ということです。
私自身がつまずいて、なんで適切に値が入らないんだろ?と悩んだことがありましたのでNoteさせていただきました。
私個人は前後の空白が取り除けるstrip関数をよく使用しておりましたが、あまり周りのSASプログラマーさんは使用していなかった気がします。
trimを使用してらした方もおりましたし、そもそも修正せず変数に代入したらそのまま出力する!という形の方もいらっしゃいます。出力でちゃんとブランクがでていないのであれば、それでもいいのかもしれません。
でもブランクがでることもあるので、文字型変数を取り合う際に片隅にこのことを入れておきましょう!!
それにしてもタイトルをかっこつけすぎな感じがする今日この頃。少し落ち着こうかな笑