目に見えない改行コードが邪魔をしてくる話

今、








こういう、どうってことないデータセットがあったとします。
Xは文字型です。

そして、

data A1;
 set Q1;
 Y=input(X,8.);
run;

というなんてことない処理(Xを数値化してYに割り当てる)を実行します。


結果は








え?

見た目は同じなのに2オブザベーション目だけ欠損値です。

ログにも、確かに欠損値が生成されたNoteはでていますが、






引数が無効と言われても、、。といった感じです。

これ、知らないと一生解決できないんじゃないか系のトラブルです。
以前紹介した「背筋が凍る、厄介でおっかない小数点誤差の話」
http://sas-tumesas.blogspot.jp/2014/03/blog-post_14.html
に似てますね。



実は冒頭のデータセットは

data Q1;
length X $10.;
 X='1';output;
 X=cats('0A'X,'1');output;
run;

というコードで生成したものです。

ん?2個目のXで、1にくっつけている'0A'Xってなに?

これ、実は改行コードの一部(ラインフィールド)を指定する意味をもった記述なんです。
通常、こいつと'0D'x(キャリッジリターン)を合わせて、改行をさせます。

こういう意味をもった記号があって(タブ('09'x)とか)、そいつらが往々にして
僕らの大切な時間と精神力を奪っていきます。

対策は簡単で

data A2;
 set Q1;
 Y=input(compress(X,'0A'X || '0D'X),8.);
run;

取り除いてからinputです。

例えば、エクセルからデータを読み込んでデータセットを作る場合なんかによくこの問題が
浮上します。

見栄えをよくするために、結構セル内改行つかったりしていることが多いんですよね。






0 件のコメント:

コメントを投稿