SAS XPTビューワを更新しました(v0.2.1.0)
対応フォーマットを追加しました。
- 修正:BINARY
- 追加:DATETIME, BEST
バージョンは0.2.1.0です。
こちらからどうぞ
https://bitbucket.org/t_kawakami/xptviewer-for-public/src/main/
あとはw.dフォーマットですかね。当初の想定としてはここまで対応できれば、まぁいいんじゃないかと考えてました。(本当はZw.dに対応したい)
以下は修正時の小話です
BINARYフォーマットは長さが61-64の場合だけ、浮動小数点で処理しているようです。
バージョン0.1.3.0では64のときだけ浮動小数点として、63までは通常のバイナリとして出力していましたので修正しました。
64ビット=8バイトですからこの場合は正しい値が得られるのですが、BINARY61.とか、何か需要があるんでしょうか。壊れた0と1の羅列を生成してどうしろと?
data _null_; a=123; put a=; b=put(a,binary64.); put b=; c=input(b,binary64.); put c=; put; put a=; b=put(a,binary61.); put b=; c=input(b,binary61.); put c=; run;
DATETIMEについては、DATEフォーマットとTODフォーマットができていたので(そのつもりでDATETIMEは後回しにしていました)他より労力はかかりませんでした。
負の値さえ別に処理させれば、「ほぼ(絶対ではない)」、DATEフォーマットで生成する日付部分とTODフォーマットで生成する時刻部分でDATETIMEフォーマットの結果が生成できます。
また、BESTw.フォーマットは解析に丸々2日かかりました。
動作仕様がまったくもって不明なので(何を以て「ベスト」なのかの判断基準が不明)、複数の桁数の値を実際にputして、法則性を探る、という手探りな状況でした。
特に困ったのは指数表記で、これは規則性のない結果があるため、一部ハードコーディングしています。
data _null_; a=10000; put a=best3. / a=best4.; a=11000; put a=best3. / a=best4.; a=19400; put a=best3. / a=best4.; run;
上記のプログラムを実行するとこんな結果になります。
元の値によって、フォーマットの長さが違っても、結果が同じだったり異なったりするのです。