今回の記事はSAS9.3以前で発生するバグの話です。
(9.4では解消されてます)
CDISC対応でADaMのデータセットをよく作る方なら既にご存知かもしれません。
SAS社の Problem Note にE8601DTインフォーマットのバグについての記載があります。
Problem Note 43743: E8601DT informat might read beyond its intended boundary
http://support.sas.com/kb/43/743.html
再現してみましょう。
data TEST;
length X1 X2 $16.; X1 = "2018-01-01T10:00"; X2 = ":15"; format Y e8601dt.; Y = input( X1, e8601dt. ); run; SAS9.4での実行結果
SAS9.3での実行結果(Bug)
|
9.3で実行すると、X1とX2が合体した日時がYに格納されてしまいました。
内部の動きとして、E8601DTインフォーマットはデフォルトで入力データから19文字読み込もうとします。
しかしX1はlengthが16しかないので、残りの3文字をX2から読み込んできちゃうという暴挙にでるわけです。
解決策
このバグが解消されているSAS9.4で実行するのが手っ取り早いです。
9.3なら、変換する変数のlengthを16じゃなくて19に設定しとくとか、
または以下のような感じでINPUT関数で変換する時に、後ろに半角スペースを3文字分くっつけて、無理矢理19文字にするっていうのはどうでしょうか。これらは検証してないんでうまくいくかは保証できないです。
if X1 ^="" then Y = input( X1 || " ", e8601dt. );
if X1 ^="" then Y = input( X1 || " ", e8601dt. );
よーわからんですね。気をつけましょう。
0 件のコメント:
コメントを投稿