我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

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;

f:id:japelin:20211014232432p:plain




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;

上記のプログラムを実行するとこんな結果になります。
f:id:japelin:20211014233704p:plain

元の値によって、フォーマットの長さが違っても、結果が同じだったり異なったりするのです。