2018年3月30日金曜日

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




以下をご覧ください。

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

  X  
 abc 

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


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

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

  X  
  Y  
 abc   4


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

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



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




なので、

  Y = index( X, " " );


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

  Y = X || "def";


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


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

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




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


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


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

   where X = "abc  ";



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

   where X = "abc";


0 件のコメント:

コメントを投稿