〜を使った便利なテクニック
ステップ 数 編〜
関SAS Institute Japan株式会社
カスタマーサービス本部
プロフェッショナルサービス第二部
石井 宏司

Agendaw 意外に知らないDATAステップ関数：– 6.12〜8.2での拡張機能を振り返って– 文字列操作– 文字列と数字戻り値– マクロ関数？

2

DATAステップ関数の増強(6.12)
w SCL関数の多くをサポート– SASファイルや外部ファイルの情報取得が容易に。

w ％SYSFUNC、%QSYSFUNC– 処理スタック、配列、マクロ関連などの一部を除く全てのDATAステップ関数をマクロから利用可能

3

SAS6.12新関数
w データセット関数– EXIST
ライブラリのメンバの存在を確認する。
– OPEN/CLOSE
データセットを開く/閉じる。
– ATTRC(N)
データセットの文字（数値）属性の値を返す。
– FETCH/FETCHOBS
オブザベーションをデータセットから読込む。
– REWIND
データセットの先頭にポインタを置く。
– NOTE/POINT/ DROPNOTE ノートマーカを記録/位置付け/削除する。
– CUROBS
現在のオブザベーションの番号を返す。
– DSNAME
IDに対応するデータセット名を返す。

4

SAS6.12新関数
w 変数関数– GETVARC/GETVARN– VARFMT/VARINFMT– VARLABEL– VARLEN– VARNAME– VARNUM– VARTYPE

5

データセットの文字(数値)変数値を返す。
変数に割当てた出力(入力)形式を返す。
データセット変数に割当てたラベルを返す。
データセット変数長を返す。
データセット変数名を返す。
データセット変数の数を返す。
データセット変数のデータ タイプを返す。

SAS6.12新関数
w 外部ファイル関数(1)– FEXIST/FILEEXIST– FOPEN/FCLOSE– FDELETE– FREAD/FWRITE– FGET/FPUT– FNOTE/FPOINT– FREWIND– FAPPEND

6

外部ファイルの存在を確認する。
外部ファイル(ディレクトリ)を開く/閉じる。
外部ファイルを削除する。
FDBと外部ファイルのデータ移動。
変数とFDBのデータ移動。
レコードポインタを記録/位置付ける
ポインタをファイル先頭に配置する。
現在のレコードをファイル末尾に追加する。

SAS6.12新関数
w 外部ファイル関数(2)– FILENAME
ファイル参照名を割当てる/解除する。
– FILEREF
ファイル参照名の割当を確認する。
– FINFO
外部ファイル情報を返す。
– FOPTNUM/FOPTNAME 外部ファイル情報の項目数/項目名を返す。
– FRLEN
現在のレコード サイズを返す。
– FCOL/FPOS
FDB内でのカラム位置を返す/設定する。
– FSEP
FGET 関数のトークン デリミタを設定する。

7

SAS6.12新関数
w 外部ファイル関数(3)– DOPEN/CLOSE– DREAD– MOPEN

ディレクトリを開く/閉じる。
ディレクトリメンバの名前を返す。
ディレクトリ ID とメンバ名でファイルを開く。

– DINFO
ディレクトリについての情報を返す。
– DNUM
ディレクトリ内のメンバ数を返す。
– DOPTNUM/DOPTNAME ディレクトリ情報の項目数/項目名を返す。
– PATHNAME
ファイル/ライブラリ参照名から物理名を返す

8

SAS6.12新関数
w ライブラリ/カタログ関数– CEXIST– LIBNAME– LIBREF

9

SAS カタログ(又はエントリ)の存在を確認する。
ライブラリ参照名を割当てる/解除する。
ライブラリ参照名の割当を確認する。

SAS6.12新関数
w 特殊関数– GETOPTION– SPEDIS– SYSGET– SYSMSG– SYSRC– SYSTEM

10

SAS システム オプションの値を返す。
2 つのワードの非対象なスペルの隔りを返す。
指定したホスト環境変数の値を返す。
エラー/警告メッセージを返す。
システム エラー番号、又は終了状態を返す。
SAS セッション中にOSコマンドを発行する。

そしてSAS8
w Webへの対応が容易に
w 他プログラミング言語などで標準的に装備されている機能が追加された。
w 変数情報がより詳細に取得可能になった。
– データ構造に依存しにくいコーディングが容易に。

w 地味ながらもSASware Ballot の結果を反映。

11

ちょっと寄り道
SASware Ballot
米国ＳＡＳ本社が例年行っている調査で、ＳＡＳシステムに追加してほしい機能にユーザが投票できる機会でもあります。
世界中のすべてのＳＡＳユーザが調査に参加できます。
SASware Ballot調査は年末にWebを通して実施されます。
このSASware Ballot Surveyウェブページが利用可能な期間中は、米国ＳＡＳ社サイトのトップページ、Service&Supportのページ、Technical Supportのページなどからダイレクトにリンクが張られ、年明けに調査が締め切られた後、その結果がSUGIで発表されます。ユーザ様からの提案は、SAS社スタッフへのご提案の他、Phone: +1‑919‑677‑8008 またはEmail: suggest@sas.com でも受け付けています。
URL http://support.sas.com/techsup/news/sasware.html
12

SAS8新関数
数学関数
w COMBｎ個の母集団からｒ個を抜出す組合せ数を返します
w CONSTANT 数学や計算機で用いられる定数を返します
w DEVIANCE デビアンスを返します
w FACT階乗値を返します
w PERM
n個の母集団からｒ個を抜出す場合の順列の数を返します
SAS/STATからの移行

w PROBBNRM 二変量正規分布の有意確率値を返します
w PROBMC 多重比較のパーセント点/有意確率値を返します13

SAS8新関数
変数情報関連w VNAME(X)/VLABEL(X)
変数名/ラベルを返します。
w VTYPE(X)/VLENGTH(X)
変数の型/長さを返します。
w VFORMAT(X)/VINFORMAT(X)
変数に割り当てられている出力/入力形式を返します。
w VFORMATN(X)/VINFORMATN(X)
変数に割り当てられている出力・入力形式の名称部のみを返します。
w VFORMATD(X)/VINFORMATD(X)
変数に割り当てられている出力/入力形式の少数桁数部を返します。
w VFORMATW(X)/VINFORMATW(X)
変数に割り当てられている出力/入力形式の総桁数部を返します。
w VARRAY(X) 配列であるかどうかを返します。
w VINARRAY(X) 配列要素であるかどうかを返します。
14

SAS8新関数
日付関連
w DATDIF ２つの日付間の差を日単位で返します。
w YRDIF
２つの日付間の差を年単位で返します。
w JULDATE7 ユリウス暦を７桁の整数として返します。
特殊関数
w IORCMSG_IORC_自動特殊変数に関するメッセージを返します。

w MISSING
引数が欠損かどうかを返します。
15

SAS8新関数WEB技術関連
w HTMLENCODE/HTMLDECODE‘<‘や’&’などのHTML上で特別な意味を持つ特殊文字のエンコード/デコード
w URLENCODE/URLDECODE‘=‘や’:’などのURLエスケープ文字列のエンコード/デコード

16

SAS8新関数
会計関数
w CONVX/CONVXP
列挙キャッシュフロー/定期キャッシュフローストリーム のコンベ
クシティを返します。

w DUR/DURP
列挙キャッシュフロー/定期キャッシュフローストリーム の修正
期間を返します。

w PVP
定期キャッシュフローストリームの現在価値を返します。

w YIELDP
定期キャッシュフローストリームの満期利回りを返します。
17

SAS8新関数
DBCS関数（SBCS用に対応するものが存在しないもの）
w KCOMPARE– 文字列の比較結果を返します。

w KCOUNT– 文字列内の2バイト文字の数を返します。

w KSTRCAT– 2つ以上の文字列を連結します。

w KTRUNCATE– 指定した長さに文字列を切り捨てます。

w KUPDATE / KUPDATEB– 文字値の内容を挿入、削除、置き換えます。
18

SAS8で拡張された関数
w PUT
w SCAN

出力のアラインメント調整が可能になった。
右側からの単語走査が可能になった。

・・・仕様変更
w QUOTE 末尾ブランクを取り除かなくなった。
→ TRIM、TRIMN関数の併用が必要な場合あり。

・・・番外ＫＣＶＴ19

DBCSコードを変換します。

正規表現関数およびルーチン
w 正規表現(Regular Expression)−正則表現、有理表現とも。
『 特定の文字列ではなく、文字列の一部を一般化して表現するための手法。もともとはコンピュータ言語理論の分野において、字句（変数名や予約語、その他の識別子）を一般化して定義するために考案された表現手法。通常のコンピュータ利用では、ドキュメントからの文字列検索時などに、検索したい文字列すべてを指定するのではなく、文字列の任意の一部を置き換え可能な状態で検索する場合などに用いる。』（アスキーデジタル用語辞典より）
20

正規表現関数およびルーチン
rx=RXPARSE(pattern-expression)
w パターンを解析して値を返します。
position=RXMATCH(rx, string)w パターンが一致するサブストリングの先頭を見つけて、値を返します。
CALL RXFREE(rx)w ほかの正規表現（RX）関数やCALLルーチンによって割り当てられたメモリを開放します。
21

正規表現関数およびルーチン
w CALL RXSUBSTR(rx, string, position<, length<,score>>)w パターンが一致する位置、長さ、およびサブストリングのスコアを検索します。
w CALL RXCHANGE(rx, times, old-string<, newstring>)
w パターンが一致する1つ以上のサブストリングを変更します。

22

RX関数における正規表現
w ２種類の構文– 検索構文– 置換構文RXMATCH、RXSUBSTR 用RXCHANGE 専用

w 記述可能な要素– 文字列– 文字クラスw 組込みw ユーザ定義– タグ、スコア、NOTやOR条件などの制御文字
23RX関数における正規表現
w 組込み文字クラス– ？
– $A / $L / $U
– $D
– $W
– $C、$I

一文字のワイルドカード
アルファベット / 小文字 / 大文字
数字
空白、タブ、キャリッジリターンなど
SAS名として有効な文字 / 先頭文字

w 組込みパターン（不定長）
– ：
– $N
– $F
– $Q
– $(n)、$[n]、${n}24

任意長 のワイルドカード
SAS名
数値
クォートされた文字列
ネストされた括弧の任意レベル部分

RX関数における正規表現
w オプションなど– $P / $S
– ＾/~– |– @n– ＊/＋
– #=n– <>25

語頭 / 語尾 条件
NOT条件
OR 条件
パターンマッチング開始位置
パターンのくりかえし
任意スコア値の割当
タグ：置換時再利用の為の部位指定

文字列操作関数
w INDEXw INDEXCw INDEXW
w VERIFY
w TRANSLATEw TRANWRD
w SCAN26戻り値が数値ということは・・・
文字列に関する情報を数値として得られる関数など
w LENGTH
w INDEXw (比較演算)→REPEAT、SUBSTR、SCAN等、数値を引数にとる関数の入力として使える
Ex.
SEG = SCAN(‘未婚女性 未婚男性 既婚女性 既婚男性’,
1 + (SEX=‘M’) + (MARRIAGE=‘Y’)*2 );PARM = SCAN(SUBSTR(STMT,INDEX(COMMAND,’PARM=’)+5),1);
MASK = SUBSTR(REPEAT(‘*’,LENGTH(PASSWORD)),2);27

マクロ化して簡易にw 概念的に一つの関数のように扱いたいものを間違いを減らし使い易くする効果。
サンプル：%MEDIAN、%FACT%KANAS2D、%KANAD2S

28