CNTLIN=オプションを使うと、「データセット」から「フォーマット」を生成する事ができます。(つまり前回紹介した「CNTLOUT=オプション」の逆が出来る)
まずは簡単な例から。
たとえば、FORMATを定義したいとき以下のように書きますが、、
proc format;
value TEST1_ 1 = "MALE" 2 = "FEMALE" ; value $TEST2_ "Y" = "YES" "N" = "NO" ; run; |
別のアプローチ「CNTLIN=オプション」を使って、同様のFORMATを定義できます。
(記事の最後に、この方法の落とし穴についてのリンク記事をのせているので必ず参照下さい)
ログを見ると分かる通り、見事データセットからフォーマット「TEST1_」と「TEST2_」を生成する事が出来ました。
PROC FORMAT LIBRARY=ライブラリ.カタログ名 CNTLIN=FORMAT変換用のデータセット;
RUN; |
- 「LIBRARY=ライブラリ名」というようにカタログ名を省略した場合、ライブラリ内の「FORMATS」という名前のカタログがデフォルトで選択されます。
- FORMAT変換用のデータセットには少なくとも「FMTNAME」「START」「LABEL」という変数が必要です。
あとは以下の中から、定義したいFORMATにあわせて、必要な変数を選択してデータセットに含めます。
変数名 | 型 | 内容 |
FMTNAME | 文字 | フォーマット名 |
START | 文字 | 開始値 |
END | 文字 | 終了値 |
LABEL | 文字 | 出力値 |
MIN | 数値 | MIN=オプション値 |
MAX | 数値 | MAX=オプション値 |
DEFAULT | 数値 | DEFAULT=オプション値 |
LENGTH | 数値 | LENGTH=オプション値 。。とリファレンスに書いてありますが、 そんなオプション存在しないと思われるので詳細不明 |
FUZZ | 数値 | FUZZ=オプション値 |
PREFIX | 文字 | PICTUREフォーマットのPREFIX=オプション値 |
MULT | 数値 | PICTUREフォーマットのMULTIPLIER=オプション値 |
FILL | 文字 | PICTUREフォーマットのFILL=オプション値 |
NOEDIT | 数値 | PICTUREフォーマットのNOEDITオプションが有効かどうか (1=有効 0=無効) |
TYPE | 文字 | フォーマットの種類 N = 数値フォーマット C = 文字フォーマット I = 数値インフォーマット J = 文字インフォーマット P = PICTUREフォーマット |
SEXCL | 文字 | 開始値の取扱い ("Y"=開始値を含めない "N"=開始値を含める) |
EEXCL | 文字 | 終了値の取扱い ("Y"=終了値を含めない "N"=終了値を含める) |
HLO | 文字 | 開始値・終了値の追加情報 (すごく重要な変数) O = OTHER L = LOW H = HIGH R = PICTUREフォーマットのROUNDオプション ...等。詳細はリファレンスを参照 (組み合わせて使用します。例:Low-High…LH) |
DECSEP | 文字 | PICTUREフォーマットのDECSEP=オプション値 |
DIG3SEP | 文字 | PICTUREフォーマットのDIG3SEP=オプション値 |
DATATYPE | 文字 | PICTUREフォーマットのDATATYPE=オプション値 |
LANGUAGE | 文字 | PICTUREフォーマットのLAUNGUAGE=オプション値 |
これ見て頂くと分かる通り、前回紹介したCNTLOUT=で出来るデータセットと同じ構造です。
ここまで特に難しいことはないんですが、、ただですね、、
CNTLIN=オプションは先の例のような簡単なFORMATを定義する分にはいいけど、複雑なFORMATを定義したい場合、それなりの知識が必要になります。
例えば、以下のPICTUREフォーマットをご覧ください。
proc format;
picture TEST7_ (round) low - high = '009.00%' ; run; |
ここで問題です。
上のと同様のフォーマットをCNTLIN=で作るには、どんなプログラムを書けばよいでしょうか?
以下が正解の一例。
パッとこれが思い浮かべばいいですが、詳しくないと中々難しいと思います。
私の知る限り、実務ではこの記事の最初の方に載せた「例1」程度の簡単なフォーマットを作るのにCNTLIN=オプションを使っているのはよく見かけますね。
その①
「CNTLOUT=」でフォーマットをデータセット化して、そのデータセットに手を加えてから「CNTLIN=」でまたフォーマット化する、みたいな事をする事がありますが、、
例えば「CNTLIN=」に読み込ませるデータセットで、フォーマット値に関連する変数(START、END、LABEL等)に手を加えた場合、フォーマットの文字の長さに関連する変数(DEFAULT、MIN、MAXなど)も修正するのを忘れずに。
割と問題ありな落とし穴について、以下記事をご覧ください。
いつも参考にさせて頂いています。ラベルに誤字ありますのでご報告まで。
返信削除誤:▼ FOMRATプロシジャ入門
正:▼ FORMATプロシジャ入門
ご指摘有難う御座います、修正させていただきました!
削除いつも勉強させて頂いております!
返信削除CNTLINでフォーマットカタログを作成しましたが、LABELの内容(男)から「1」等の値を充てることはできますでしょうか?
コメントありがとうございます。
削除文字変数にFORMATを割りあてて、数値変数のように見せたいということでしょうか。
たしか「数値変数のように見せる」というのは出来なかったと思います。。
立て続けに申し訳ございません。追加で、「0101」等を読み込ませた際にあたまのゼロが落ちてしまう対策ができないか、ご教示頂きたいです。
返信削除すみません。。ちょっとお困りの状況が分からなかったのですが、
削除どういった状況か、適当なサンプルプログラム、もしくはお困りの詳細な状況を記載いただく事は可能でしょうか。