2018年3月30日金曜日

文字値の末尾にある空白問題




以下は、長さを「5」に設定した変数Xに「abc」という文字を格納しています。

data DT1;
   length X $5.;
   X = "abc";
run;

  X  
 abc 



次に以下を実行してみます。

data DT2;
   set DT1;
   Y = index( X, " " );
run;

  X  
  Y  
 abc   4


index関数は、変数に対して「特定の文字値」が何バイト目に含まれるか返します。
(シングルバイト専用。日本語等マルチバイト文字には使用NG)


今回は、変数Xに半角スペース(空白)が何バイト目に含まれているかを求めています。
結果は「4」となり、4バイト目に半角スペースが含まれているということになります。

「abc」だから半角スペースなんてないはずですよね。



実は内部では以下のように長さ5のうち、余った末尾の2バイトには半角スペースが入っています。
     
 X 
 a 
 b 
 c 
   
   




なので、

  Y = index( X, " " );

は半角スペースが4バイト目にあると解釈したわけですね。
また以下のように文字値を結合する場合も

  length Y2 $20.;
  Y2 = X || "def";

変数Xの末尾に半角スペースが2つあるので「abc  def」という結果になってしまいます。



そこでよく、trimn関数などで末尾の半角スペースを取り除く処理を入れたりします。

  Y = index( trimn(X), " " );

  length Y2 $20.;
  Y2 = trimn(X) || "def";



ただし、比較演算では末尾の半角スペースを考慮する必要はありません。
例えば「 "abc" = "abc   " 」という比較演算の結果は「等しい」と判断されます。

「比較演算では末尾の半角スペースの有無に意味を持たせていない」ということですね。


今回のデータでも、where条件を書くとき、

   where X = "abc  ";

というように、わざわざ末尾を気にしなくても、以下で問題ないです。

   where X = "abc";


0 件のコメント:

コメントを投稿