|
|
|
Page Index |
(DATAステップとPROCステップ) |
|
(ファイル操作の準備) |
|
(ファイル操作:外部ファイルを読みSASデータセットを作成する) |
|
(ファイル操作:SASデータセットを読み、別のSASデータセットを作成する) |
|
(SASデータセットの内容を外部ファイルに出力する) |
|
(その他のファイル操作) |
|
|
|
本章では、ファイル操作に関するコードサンプルを例示しています。 |
(DATAステップとPROCステップ) |
|
|
DATAステップは、外部ファイルをSASデータセットに変換したり、すでにあるデータセットを加工して、別のSASデータセットを作ります。1行目のDATA文では、作成・変更するデータセットの名前を指定します(共通)。
DATA |
DATAステップの開始とこのステップで作成する出力データセット名を宣言します。
文法
DATA SASデータセット名(データセットオプション指定)
;
※データセットを作らないときはダミーとして_null_を指定します。 |
ステートメント(複数) |
DATA ステップで使えるステートメント一覧は後述 |
RUN |
DATAステップの記述の終了を明示的に指定します。
※RUNステートメントはグローバルステートメントです。 |
DATAステップは、どこにデータが存在するかによって記述が変わります。
例 DATA _NULL_; /*データセットを作らないときはダミーとして_null_を指定*/
SET sample1: /*既存のSASデータセットからの読み込みます*/
FILE 'test.csv'; /*テキストファイルにデータを出力します*/
PUT name ',' height ',' weight ',' age ; /**/
RUN;
【SAS データセットを読み込むステートメント】
LIBNAME ステートメント、SETステートメント、MERGEステートメント、UPDATE ステートメントがあります。
【DATA ステップのループ実行】
DATA ステップは入力するオブザベーションが無ければ1
回だけ実行されます。
しかし、外部データからの入力(INPUT ステートメント)やSAS
データセットからの入力(SET ステートメントなど)
があるときは、読み取るデータ行(SAS データセットの読み取りの場合はオブザベーション)が尽きるまで、
自動的に繰り返し実行されます。
ただし、文中にRETURNステートメントがあると、現在のオブザベーションの処理を終了し、
次のオブザベーションの処理に移ります。STOPステートメントはDATAステップの処理を中止します。
自動変数 _N_ には、DATAステップの処理回数がセットされます。
|
|
データステップの基本的な流れ |
|
|
|
|
|
|
外部データの読込に用いられるステートメントには、FILENAME ステートメント、CARDS ステートメント、INFILE
ステートメント、INPUT ステートメントがあります。
例
FILENAME IN 'c:\users\ユーザ名\documents\my
sas files\9.1';
DATA sample;
INFILE IN(sample1.dat);
INPUT id name $
sex $ age height
weight;
その他の SAS文;
RUN;
FILENAME |
外部ファイルをファイル参照名として割り当てます。
外部ファイルにアクセスする場合、アクセス先を指定する実行ステートメント(INFILE
ステートメント(入力)において、そのファイルの物理パス名を記述する代わりに、あらかじめFILENAME
ステートメントでそのファイルをアクセスするためのファイル参照名を定義しておき、INFILE
ステートメントでファイル参照名を使用することができます。
文法
FILENAME ファイル参照名 '物理パス名';
※物理パス名は絶対パスを指定することが必要であるが、プログラムの始めにx
コマンドを用いて、current
directory を指定することで相対パスの指定のみでデータを読込むことができるようになります。
例
X 'cd [基準ディレクトリの絶対パス]'’ ;
FILENAME IN 'my sas files\9.1';
※FILENAMEステートメントはグローバルステートメントです。 |
INFILE |
外部データの読込に用いられるステートメントです。
文法
INFILE ‘ [外部ファイルの絶対パス] ’
DSD MISSOVER FIRSTOBS=[読込み開始行番号]
LRECL=[レコード長] ;
オプション
・「DSD」は区切り文字が連続することを認識させるために必要なオプション。
・区切り文字が指定されていない場合は「,」(カンマ)が区切り文字とされる。
・区切り文字が「,」(カンマ)以外とする場合は「DLM=’[区切り文字]’」のような形でオプションをつける。
DLM = "2C"x :カンマ区切り DLM = "09"x :タブ区切り
・「MISSOVER」は欠損値データがある場合、そのデータを欠損値として認識させる。
・「FIRSTOBS」は外部データの読み込み開始行番号を指定する。
使用例
INFILE 'c:\data\sample.txt'; |
INPUT |
外部データの読込に用いられるステートメントです。
指定の変数名の値を指定の入力形式で読み取り、読み込んだデータ値を変数に割り当てます。
文法
INPUT 変数 [$] 変数 [$] 変数 [$] .... 変数
[$] ;
使用例
INPUT name $ age sex ; /*name は文字型、age,sexは数字型で読み取る*/ |
|
|
|
外部データの読込に用いられるステートメントには、FILENAME ステートメント、CARDS ステートメント、INFILE
ステートメント、INPUT ステートメントがあります。
例
DATA Temp;
INFILE DATALINES;
INPUT name $ sex $ station $ kingaku;
DATALINES;
大阪太郎,M,天王寺,500
東京花子,F,新宿,600
・・
RUN;
CARDS |
外部データの読込に用いられるステートメントです。
これ以降にカードイメージデータが記述されていることを示します。
プログラムの中に直接データを書き込むときに記述します。 |
CARDS4 |
同 セミコロンや2バイト文字を含むデータを正しく読み取る場合にCARDSに代えて用います。 |
DATALINES |
CARDSステートメントの別名 |
DATALINES4 |
CARDS4ステートメントの別名 |
INFILE |
INFILE DATALINES;
(DATALINESというDATAステップ中の特殊なファイルを読み込むことを示す) |
INPUT |
外部データの読込に用いられるステートメントです。
指定の変数名の値を指定の入力形式で読み取り、読み込んだデータ値を変数に割り当てます。
文法
INPUT 変数 [$] 変数 [$] 変数 [$] .... 変数
[$] ; |
|
|
|
|
|
SAS データセットの読込に用いられるステートメントには、LIBNAME ステートメント、SETステートメント、MERGEステートメント、UPDATE
ステートメントがあります。
例
LIBNAMEmylib 'c:\users\ユーザ名\documents\';
DATA mylib.sample;
SET mylib.VitalSign END=syuryo;
RUN;
LIBNAME |
データライブラリにライブラリ名を割り当てます。
文法
LIBNAME ライブラリ参照名 '物理パス名';
※物理パス名は絶対パスを指定することが必要であるが、プログラムの始めにx
コマンドを用いて、current
directory を指定することで相対パスの指定のみでデータを読込むことができるようになります。
例
X 'cd [基準ディレクトリの絶対パス]'’ ;
LIBNAME mylib 'C:\mydir'; /*ユーザー定義ライブラリ mylib を割り当てます*/
※LIBNAMEステートメントはグローバルステートメントです。
|
SET |
SAS データセットの読込に用いられるステートメントです。
ひとつのDATAステップにはひとつのSET文のみ記述できます。
文法
SET SAS データセット名 オプション;
SAS データセット名:複数のSAS データセットをブランクで区切って指定できます
オプション:
end=変数名
(最後のオブザベーションを読んだ時点で指定の変数値=1
となります。)
nobs=変数名
(SET ステートメントに指定されたSAS データセットの合計オブザベーション数を
値に持つ一時的な変数を定義します。)
例
DATA Temp;
SET sample1; /*既存のSASデータセットからの読み込みを指定します*/
その他の SAS 文;
・・
RUN;
複数のデータセットを指定した場合、MERGEと異なり縦に結合したイメージで扱います。
SET=入力SASデータセット名1 入力SASデータセット名2; |
MERGE |
SAS データセットの読込に用いられるステートメントです。
複数のSAS データセットをMERGE(結合)する場合に使用します。
複数のデータセットを横に結合した形でオープンします。
データの結合をする前に、結合するキーとなる変数で並べ替え(ソート)をしておく必要があります。
例
PROC SORT DATA=file-1 OUT=file-1;
BY name;
RUN;
PROC SORT DATA=file-2 OUT=file-2;
BY name;
RUN;
DATA file-3;
MERGE file-1 file-2; /*file-1:MASTER、file-2:TRAN*/
BY ID;
その他の SAS文;
RUN; |
UPDATE |
Masterデータセットの値をTransactデータセットの値で更新する場合に用います。
例
DATA file3;
UPDATE file-1
file-2; /*file-1:MASTER、file-2:TRAN*/
BY ID;
その他のSAS文;
RUN; |
|
|
|
以下のデータセットオプションはオブザベーションをサブセット化します。
WHERE |
特定の条件にあったオブザベーションをサブセット化します。
文法
WHERE where-expression-1
使用例
DATA SASデータセット名;
SET文;
WHERE age >= 20 OR age <= 65;
その他のSAS文;
RUN;
※INPUTステートメントではWHEREステートメントは使えません。 |
KEEP |
変数をサブセット化します。
使用する変数のみを指定します。指定されなかった変数は取り込まれません。
DROPデータオプションとは併用できません。
文法
KEEP=変数1 変数2 ...
使用例
DATA SASデータセット名; SET文;
KEEP=変数1 変数2 ...;
その他のSAS文;
RUN; |
DROP |
変数をサブセット化します。
使用しない変数を指定します。指定されなかった変数のみが取り込まれます。
文法
DROP=変数1 変数2 ...
使用例
DATA SASデータセット名; SET文;
DROP=変数1 変数2 ...;
その他のSAS文;
RUN; |
|
|
|
外部データの出力にはFILE ステートメント、PUT ステートメントを用います。
FILE ステートメントでは保存するファイル名もしくはファイル名を含めた絶対パスを指定し、
PUT ステートメントでは書出す変数を指定します。
外部データの出力に用いられるステートメントには、その他にFILENAME ステートメントがあります。
例
FILENAME IN 'c:\users\ユーザ名\documents\my
sas files\9.1';
DATA sample;
FILE IN(sample1.dat);
PUT id name $ sex $ age height weight;
その他の SAS文;
RUN;
FILENAME |
外部ファイルをファイル参照名として割り当てます。
FILENAMEを用いて、ファイル参照名を指定することで、後にデータを書き込む際に指定したファイル参照名を記述するのみで書き込むことが可能となります。
文法
FILENAME ファイル参照名 '物理パス名';
※物理パス名は絶対パスを指定することが必要であるが、プログラムの始めにx
コマンドを用いて、current directory を指定することで相対パスの指定のみでデータを読込むことができるようになります。
例
X 'cd [基準ディレクトリの絶対パス]'’ ;
FILENAME IN 'my sas files\9.1';
※FILENAMEステートメントはグローバルステートメントです。 |
FILE |
データ値の出力先(外部ファイル名、リスティング、ログなど)にデータを出力する際に指定します。
文法
FILE ‘ [ファイル名] . [拡張子] ‘ DSD
LRECL=[レコード長] ;
オプション
・DSD : CSVファイルを出力することができます
・LRECL: 固定長ファイルの場合レコード長を指定します
使用例
FILE 'c:\data\sample.txt'; |
PUT |
FILEステートメントと組み合わせることで、データの書き込みを指示します。
外部ファイル、リスティング出力、ログへ指定の変数名の値を指定の出力形式で書き出します。
文法
PUT [変数名1] [変数名2] ……;
使用例
PUT name $ age sex ; |
|
|
|
DATA ステップで使えるステートメント一覧です。
ABORT |
DATAステップの実行を中断します。 |
ARRAY |
変数配列の宣言 |
ASIGN(割り当て) |
変数名=式;の形で指定する。 等号の左辺の変数に右辺の式の値を割り当てます。 |
ATTRIB |
1つの変数の属性(タイプ・長さ・フォーマット・インフォーマット・ラベル)をまとめて宣言します。
文法
ATTRIB variable-list(s)
attribute-list(s);
attribute-list(s):FORMAT=format、INFORMAT=informat、
LABEL='label'、LENGTH=<$>length、TRANSCODE=YES
| NO
例
ATTRIB 変数1 LENGTH=$2 LABEL='・・・・'
変数2 LENGTH=8 LABEL='・・・・' FORMAT = YYMMDDS10. INFORMAT
= YYMMDD10. ; |
BY |
指定の変数のソート順にオブザベーションが並んでいることを示す。 BYグループ処理を行う場合に必須となります。 |
CALL |
CALLルーティン(複数の戻り値を許す関数)の呼び出し |
CARDS |
外部データの読込に用いられるステートメントです。
これ以降にカードイメージデータが記述されていることを示します。 プログラムの中に直接データを書き込むときに記述します。 |
CARDS4 |
同 セミコロンや2バイト文字を含むデータを正しく読み取る場合にCARDSに代えて用います。 |
CONTINUE |
DOループ(DOグループ)処理の中で用い、ENDステートメントまで強制移動させてDOループ処理にとどまることを指示します。 |
DATALINES |
CARDSステートメントの別名 |
DATALINES4 |
CARDS4ステートメントの別名 |
DELETE |
現在処理中のオブザベーションの処理を中断(出力データセットに書き込まない)して、次のオブザベーションの処理に移るためにDATAステップのはじめに戻ります。 |
DO |
ENDステートメントと対で用い、条件式に合致した場合の実行範囲をDO〜ENDで囲んで指定する。 囲まれた範囲をDOループまたはDOグループと呼びます。 |
DO, iterative(繰り返しDO) |
繰り返しDOステートメントの1つで、iterativeの部分には 変数名=開始値 TO 終了値 BY 増分値というDOループ処理の実行条件指定が入ります。 |
END |
DOステートメントと対で用い、DOループ処理範囲を指定します。 |
DO UNTIL |
同 UNTIL(条件式)に指定した条件を満たさない範囲でDOループ処理を実行します。 |
DO WHILE |
同 WHILE(条件式)に指定した条件を満たしている範囲でDOループ処理を実行します。 |
ERROR |
強制的にエラーを発生させます。 |
FILE |
データ値の出力先(外部ファイル名、リスティング、ログなど)にデータを出力する際に指定します。 |
FORMAT |
指定の変数に出力フォーマットを指定する。変数の値を整形して出力することができます。 文法
FORMAT 変数 出力形式; |
GO TO |
指定のラベル名が書かれたプログラム位置に次の処理を強制移動させます。 |
Labels, Statement |
ラベル名:(コロン)の指定により、GO TOやLINKステートメントにより強制移動させるプログラム位置を示します。 |
IF, Subsetting(サブセットIF) |
指定の条件に合致するオブザベーションのみこれ以降の処理に進むことを許可します。 |
IF〜THEN |
指定の条件に合致する場合の処理を記述します。 条件に合致しない場合の処理は続くELSEステートメント記述します。 |
ELSE |
IF〜THENステートメントと共に用い、IF条件に合致しない場合の処理を記述します。 |
INFILE |
外部データの読込に用いられるステートメントです。
文法
INFILE ‘ [ファイルの絶対パス] ’
DSD MISSOVER FIRSTOBS=[読込み開始行番号] LRECL=[レコード長] ;
・「dsd」は区切り文字が連続することを認識させるために必要なオプション。
・区切り文字が指定されていない場合は「,」(カンマ)が区切り文字とされる。
・区切り文字が「,」(カンマ)以外とする場合は「dlm=’[区切り文字]’」のような形でオプションをつける。
・「missover」は欠損値データがある場合、そのデータを欠損値として認識させる
使用例
INFILE 'c:\data\sample.txt';
|
INFORMAT |
指定の変数に入力フォーマットを指定します。 |
INPUT |
外部データの読込に用いられるステートメントです。
指定の変数名の値を指定の入力形式で読み取り、読み込んだデータ値を変数に割り当てます。
文法
INPUT 変数 [$] 変数 [$] 変数 [$] .... 変数 [$] ;
使用例
INPUT name $ age sex ; /*name は文字型、age,sexは数字型で読み取る*/ |
KEEP |
出力データセットに含める変数を指定する |
LABEL |
指定の変数に変数ラベルを定義する |
LEAVE |
DOループ(DOグループ)処理の中で用い、ENDステートメントの次のステートメントまで(ラベルを指定していた場合はラベル位置まで)強制移動させてDOループ処理を抜けることを指示します。 |
LENGTH |
作成する変数のタイプと長さを定義します。
文法
LENGTH 変数 [$] n 変数 [$] n 変数 [$] n .... 変数 [$] n; |
LINK |
指定のラベル名が書かれたプログラム位置からRETURNステートメントまでの範囲に記述されたサブルーティンに処理を強制移動させた後、移動前の位置に戻るよう指示します。 |
LIST |
変数の値をログに書き出します。 |
MERGE |
SAS データセットの読込に用いられるステートメントです。
複数のデータセットを横に結合した形でオープンします。 |
OUTPUT |
指定のSAS データセットに現在処理中のオブザベーションを書き込みます。
OUTPUT文はオブザベーションの生成を明示的に指示します。
OUTPUT文を複数書くことで、入力オブザベーション1件に対して、
複数のオブザベーションを出力することができます。
なお、DATAステップ中にOUTPUTステートメントが使われていれば、
現在処理中のオブザベーションの暗黙的な出力はされません。
文法
OUTPUT SASデータセット名; |
PAGE |
改ページを指示する。 DATAステッププログラミングによるレポート作成用ステートメント |
PUT |
FILEステートメントと組み合わせることで、データの書き込みを指示します。
外部ファイル、リスティング出力、ログへ指定の変数名の値を指定の出力形式で書き出します。 |
PUTLOG |
FILEステートメントの指定する書き出し先に無関係に、ログにメッセージを書き出す |
RENAME |
変数名を変更します。複数の変数名を変更する場合は、
RENAME=(age=nenrei height=shincho)
というように変数名=新変数名のパターンをブランクで区切って並べます。 |
RETAIN |
指定の変数値の現在値を次のオブザベーション処理に変わっても初期化せずに保持するよう宣言する。通常は次のオブザベーション処理で変数の値は初期化されます。
文法
RETAIN 変数1 変数2 ・・・変数n ; |
RETURN |
現在のオブザベーションの処理を終了し、次のオブザベーションの処理に移ります。
もし。DATAステップ中にOUTPUTステートメントがなければ、ここでオブザベーションが出力されます。
OUTPUTステートメントが使われていれば、ここでは出力されません。
LINKステートメントからの分岐の場合はLINKの次のステートメントに処理を戻します。 |
SELECT |
条件選択のために条件を指定します。 |
SET |
SAS データセットの読込に用いられるステートメントです。
ひとつのDATAステップにはひとつのSET文のみ記述できます。
文法
SET SAS データセット名
オプション;
SAS データセット名:複数のSAS
データセットをブランクで区切って指定できます
オプション:
end=変数名
(最後のオブザベーションを読んだ時点で指定の変数値=1
となります。)
nobs=変数名
(SET ステートメントに指定されたSAS データセットの合計オブザベーション数を
値に持つ一時的な変数を定義します。)
複数のデータセットを指定した場合、MERGEと異なり縦に結合したイメージで扱います。
SET=入力SASデータセット名1 入力SASデータセット名2; |
SKIP |
ブランク行を書き出す。 DATAステッププログラミングによるレポート作成用ステートメント |
STOP |
DATAステップの処理を中止します。 |
Sum |
変数名+式の形で指定する。DATAステップのループ処理中の変数値は右辺の式の値の累積値を値として持ちます。 |
UPDATE |
SAS データセットの読込に用いられるステートメントです。
変数名+式の形で指定する。DATAステップのループ処理中の変数値は右辺の式の値の累積値を値として持ちます。 |
|
|
|
|
|
データベーステーブルをSASのデータセットとして取り込む場合は、PROC
SQL を使用します。
CSV形式ファイルの入出力に関するプロシジャーも準備されています。 |
|
PROCステップで使えるステートメント一覧
PROC APPEND |
データセット最後のオブザベーションの後に他のデータセットのオブザベーションを追加する
例 WORK.APPEND を WORK.BASE に追加する
proc append base = base data = append force;
run;
forceオプションは、異なる変数が含まれていた場合にも強制的に結合する |
PROC COMPARE |
2つのデータセットの内容を比較する |
PROC CONTENTS |
データセットのコンテンツ情報(オブザベーション数などの一般属性と変数名や変数タイプなどの変数属性)を表示したりデータセットに出力する |
PROC COPY |
データセットをコピーする |
PROC DATASETS |
特定のライブラリに格納されているデータセット名のリストを表示したり、個々のデータセットの名前の変更・削除などを行う。
また、個々のデータセットに関する属性の表示や編集を行う |
PROC DELETE |
DATASETSプロシジャの機能の一部であるデータセットの削除を行う |
PROC EXPORT |
データセットを外部ファイル形式に変換する。
IMPORTプロシジャの逆の操作を行う |
PROC FORMAT |
ユーザー定義フォーマットを作成する |
PROC IMPORT |
特定の形式(CSV形式など)の外部ファイルからデータを読み取りデータセットに変換する |
PROC PRINT |
データセットの値をリスト表示する |
PROC PRINTTO |
リスティング出力の出力先をファイルに変更する |
PROC SORT |
オブザベーションを指定の変数値の順に並び替える |
PROC SQL |
SQL言語によるデータ検索・加工を行う |
PROC TRANSPOSE |
データセットを転置(行と列を交換)する |
|
|
|
|
データセットオプションは、SASデータセット名の後ろに括弧ではさんで1つまたは複数指定します。
SET SASデータセット名(データセットオプション1
データセットオプション2 ..);
データセットオプションは、入力や出力するSASデータセットに対しいろいろな作用を与えます。
KEEP |
使用する変数のみを指定します。
指定されなかった変数は取り込まれません。
DROPデータオプションとは併用できません。
文法
KEEP=変数1 変数2 ...
使用例
SET ds-1(KEEP=id name); |
DROP |
使用しない変数を指定します。
指定されなかった変数のみが取り込まれます。
文法
DROP=変数1 変数2 ...
使用例
SET ds-1(DROP=num num2); |
FIRSTOBS |
読み込みを開始するオブザベーション番号を指定します。
出力データセットには指定できません。
文法
FIRSTOBS=n
使用例
SET ds-1(FIRSTOBS=2); |
OBS |
読み込みを終了するオブザベーション番号を指定します。
出力データセットには指定できません。
文法
OBS=n
使用例
SET ds-1(OBS=100); |
IN |
読み込み状態を保持する変数を指定します。
0が読み込まれていない。1が読み込まれていることを意味します。
文法
IN=変数名 |
WHERE |
特定の条件にあったオブザベーションをサブセット化します。
FIRSTOBS=データセットオプションより先に適用されます。
文法
WHERE=(条件式)
使用例
SET ds-1(WHERE=(age > 20));
※DATAステップやPROCステップ処理の前にWHERE条件式を満たすオブザベーションを選択することができます。 |
RENAME |
変数名をリネームします。
文法
RENAME=(元変数名1=新変数名1 元変数名2=新変数名2
..)
使用例
SET ds-1(RENAME=(num=num2)); |
INDEX |
出力SASデータセットに対し、インデックス化するキー変数を指定します。
文法
INDEX=(変数名1 変数名2
..) |
LABEL |
出力SASデータセットのデータセットラベルを指定します。
文法
LABEL="文字列" |
TYPE |
文法
TYPE=文字列 |
SORTEDBY |
ソートされたデータをデータ行や外部データから読み込む時、ソート済みの事実を明示的に記録するために用います。
文法
SORTEDBY=変数1 変数2 ..
SORTEDBY=変数1 DESCENDING 変数2 .. |
|
|
|
(ファイル操作の準備) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
フォルダーの作成
OPTIONS NOXWAIT NOXSYNC; /* tell SAS to return control back to SAS after executing
the
command and not to wait
for input from the
user.*/
X "md (パス名)";
フォルダーの削除
OPTIONS NOXWAIT NOXSYNC;
X "rd (パス名)";
|
|
|
|
|
|
|
|
FILENAME in ('c:\sales93.dat','c:\sales94.dat','c:\sales95.dat'); /* */
DATA salesall;
INFILE in; /*外部ファイルからの読み込みを指定します*/
INPUT name $ year uriage; /*データの読み込みを指定し,読み込んだデータ値を変数に割り当てます*/
RUN; |
|
|
|
|
PROC CONTENTS プロシジャーを使用して、ライブラリに格納されているデータの一覧を表示します。
取得できる情報は、OBS数、ファイルの絶対パス、変数、タイプ、長さ、など。
結果はアウトプットウィンドウに表示されます。
LIBNAME ライブラリ名 '絶対パス名'
PROC CONTENTS DATA=ライブラリ名.SASデータセット名1 /*コンテンツ情報を取得*/
/*アウトプットはデータセットに出力*/
OUT=ライブラリ名.SASデータセット名2 ORDER=VARNUM;
RUN;
LIBNAME ライブラリ名 '絶対パス名'
PROC CONTENTS DATA=ライブラリ名._ALL_ NODS;; /*ライブラリのすべてのデータセットを表示*/
RUN;
【オプション】
・VARNUM : 変数が格納されている順番で表示する。通常はアルファベット順
・_ALL_ : ライブラリの中のすべてのSASデータセットをリストします。
・NODS : ディスクリプタ部を表示しません。
・OUT= : 出力先にデータセットを指定した場合には、
論理的な配置順は生成されたデータセットの中に変数VARNUMとして出力されます。 |
|
|
|
|
*SASデータセットから変数の数を取得する
%MACRO varcnt(data=,mvar=);
* data : SASデータセット(I)
* mvar : 変数の数(O)
%GLOBAL &mvar; /* グローバル変数mvarを定義*/
PROC CONTENTS data=&data /* SASデータセットのコンテンツ情報を取得
*/
out=_tmpxx_ noprint;
RUN;
DATA _null_ ;
SET _tmpxx_ NOBS=cnt;
CALL SYMPUT("&mvar",left(put(cnt,8.)));
/* 変数の数をマクロ変数mvarに格納 */
STOP;
RUN;
%MEND;
%varcnt(DATA=sasuser.class,mvar=test); /* マクロの呼び出し */
%PUT &test; |
|
|
|
|
%MACRO varcnt(data=,mvar=);
* data : SASデータセット(I)
* mvar : 変数の数(O)
PROC CONTENTS DATA=&data out=_tmpxx_(keep=varnum
name label) noprint; /* SASデータセットのコンテンツ情報を取得
*/
RUN;
%GROBAL varNAME varLABEL /* マクログローバル変数の定義*/
%LOCAL I MAXOBS NOBS; /* マクロローカル変数の定義*/
DATA _null_;
SET _tmpxx_ nobs=cnt;
CALL SYMPUTX('MAXOBS', cnt); /* マクロローカル変数 MAXNUM に最大obsを格納
*/
STOP;
RUN;
%DO I=1 %TO &MAXOBS;
%LOCAL NAME&I LABEL&I; /* マクロローカル変数 NAMEn とLABELn を定義*/
%END;
* コンテンツ情報から変数名, ラベルをマクロ変数へ代入;
DATA _NULL_;
SET _tmpxx_; /* コンテンツ情報 */
CALL SYMPUT(CATS('NAME',
varnum), TRIM(name));
/* cats:文字列の結合 symput:マクロ変数の定義 */
CALL SYMPUT(CATS('LABEL', varnum), KTRIM(label));
RUN;
%MEND; |
|
|
(ファイル操作:外部ファイルを読みSASデータセットを作成する) |
|
|
【サンプル1】 : DATA文を使用したケース
DATA SASデータセット名;
INFILE 'パス名+CSVファイル名' DLM=',';
INPUT name $ address $ ・・・ 変数名n
; /*CSVファイルを読み変数名の順番に対応してセットされる*/
その他のSASステートメント
RUN;
文字タイプの項目を読み込む場合は、変数名の後に「$マーク」を付けて文字変数であることを宣言します。
【サンプル2】 : PROC文を使用したケース
PROC IMPORT OUT= libref.data
DATAFILE= "パス名+CSVファイル名"
DBMS=CSV REPLACE; GETNAMES=YES;
DATAROW=2;
RUN;
REPLACEオプションは 出力データセットが存在したら置き換えを行います。
GETNAMESステートメント 先頭行を変数名として使う場合に「YES」と指定します。
DATAROWステートメントでデータの開始行を指定します。
|
|
|
|
|
DATA SASデータセット名;
INFILE 'パス名+ファイル名' DLM='09,X'; /*デリミッター(区切り文字)としてタブ記号を指定*/
INPUT name $ address $ ・・・ 変数名n
; /*タブ区切りファイルを読み変数名の順番に対応してセットされる*/
その他のSASステートメント
RUN; |
|
|
|
|
DATA SASデータセット名;
INFILE 'パス名+CSVファイル名';
INPUT name$ 1-8 address$ 9-28 ・・・ 変数名n
95-100;
その他のSASステートメント
RUN;
桁数が揃えて入力されているファイルを読み込む場合は変数名の後ろにカラムを明記します。 |
|
|
|
|
プログラム(IMPORTプロシジャ)を使用してCSV形式のファイルを読み、SASデータセットを作成する。
文法
PROC IMPORTステートメント
OUTオプション : 出力するSASデータセットを「ライブラリ参照名.データセット名」形式で指定する
DATAFILEオプション : 入力するCSVファイルのパスとファイル名を指定する
DBMSオプション : CSVファイルの場合は「CSV」を指定する
REPLACEオプション : 出力データセットが存在したら置き換えを行なう場合に指定する
GETNAMESステートメント : 先頭行を変数名として使う場合は「YES」を指定する
DATAROWステートメント : データの開始行を指定する
使用例
PROC IMPORT OUT= libref.data
DATAFILE= "c:\temp\class.csv"
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
RUN; |
|
|
|
|
DDE の機能(Base SAS)を使用してExcelシートに読み込む
(IMPORTプロシジャで簡単に実現できるがSASオプションのライセンス契約が必要)
OPTIONS NOXWAIT NOXSYNC; /* EXCELを起動 */
X "start C:\sample.xlsx";
DATA _null_;
x=SLEEP(10); /* Excelの起動を10秒待機 */
RUN;
FILENAME data dde 'Excel|Sheet1!r1c1:r19c5'; /* range は
RC 形式でも A1 形式でもよい*/
DATA data;
INFILE sheet1; /* ファイル読み込み */
INPUT name $ age sex $ weight height;
RUN;
OPTIONS NOXWAIT XSYNC; /* EXCELを終了*/
FILENAME data dde 'excelsystem';
DATA _null_;
FILE data;
PUT [QUIT()];
RUN;
OPTIONS XWAIT XSYNC;
<DDEオプション>
notab : Excelから送られたデータ中のタブをスペースに変換しないようにする。
dlm= : 区切り文字を指定。'09'xはタブ文字の16進文字コード。
例) Excel…DLM='09'x;
DSD : 区切り文字が2つ連続した場合に欠損値として扱う。デフォルト区切り文字はコンマ。
MISSOVER : INPUTステートメントが現在のレコードの終わりに到達した時に
見つからなかった変数値が欠損値として設定される。
lrecl : レコード長をバイト単位で指定します。Windowsでのデフォルト値は256。
record-lengthの値は、1〜1,048,576(1MB)の範囲で指定できる。
SAS社 Customer Support / Technical Support に記載がありますので参照してください。
※参考1 Windows版SAS 8.2にて、データセットをMS Excelに出力する際に変数ラベルを出力する
※参考2 SASシステムとExcelとのデータ交換(DDE)
|
|
|
|
|
|
PROC SQL;
CONNECT to ODBC
(noprompt="driver=microsoft access driver (*.mdb);dbq=(mdbファイルのパス)");
CREATE TABLE (SASデータセット名) as
SELECT * from connection to odbc
(select * from "(mdbファイルのテーブル名)");
DISCONNECT from ODBC;
QUIT; |
|
|
|
DATA Temp;
INFILE DATALINES; /*DATALINESというDATAステップ中の特殊なファイルを読み込むことを示す。*/
INPUT name $ sex $ station $ kingaku;
DATALINES;
大阪太郎,M,天王寺,500
東京花子,F,新宿,600
・・
RUN; |
|
|
|
|
外部ファイルのレコード(行)における読み取りポインタの絶対カラム位置を与え読み取ります。
@カラムポインター位置 変数名
読み取り編集形式(INFORMAT)名.を1
セットとして読み取りたい項目分指定します。
【行の絶対位置指定】
DATA sample;
INFILE 'パス名+CSVファイル名';
INPUT @14 sex $1. /*14カラム目から1文字を文字型変数 sex に格納する*/
@4 name $10.
/*4カラム目から10文字を文字型変数 name に格納する*/
@1 ID 3..; /*1カラム目から3文字を数字型変数 ID に格納する*/
その他のSASステートメント
RUN;
【行の相対位置指定】
DATA sample;
INFILE 'パス名+CSVファイル名';
INPUT ID 1-3 /*1カラム目から3文字を数字型変数 ID に格納する*/
name$ 4-13 /*3カラム目から10文字を文字型変数 name に格納する*/
sex$ 14-1 /*14カラム目から1文字を文字型変数 sex に格納する*/
その他のSASステートメント
RUN;
|
|
|
(ファイル操作:SASデータセットを読み、別のSASデータセットを作成する) |
|
|
DATA Temp;
SET sample1; /*既存のSASデータセットからの読み込みを指定します*/
その他の sas 文;
・・
RUN; |
|
|
|
|
DATA SASデータセット名1 SASデータセット名2;
SET 既存SASデータセット名;
IF sex = 'M' THEN OUTPUT SASデータセット名1 ;
ELSE OUTPUT SASデータセット名2 ;
RUN;
*既存のSASデータセットをもとに、男性のデータからなるSASデータセット1、女性のデータからなるSASデータセット2を作成します。
*OUTPUTステートメント:処理しているオブザベーションを出力SASデータセットに出力する。 |
|
|
|
DATA file-3;
SET file-1 file-2; /*既存のSASデータセットを指定*/
RUN;
複数のデータセットを指定した場合、MERGEと異なり縦に結合したイメージでオープンされる
この場合、file-1のうしろ(縦)にfile-2のオブザベーションが追加される |
|
file-1
|
tanka |
suryo |
行1 |
X1 |
Y1 |
行2 |
X2 |
Y2 |
行3 |
X3 |
Y3 |
|
file-2
|
tanka |
suryo |
行1 |
X10 |
Y10 |
行2 |
X20 |
Y20 |
行3 |
X30 |
Y30 |
|
→ |
file-3
|
tanka |
suryo |
行1 |
X1 |
Y1 |
行2 |
X2 |
Y2 |
行3 |
X3 |
Y3 |
行4 |
X10 |
Y10 |
行5 |
X20 |
Y20 |
行6 |
X30 |
Y30 |
|
|
|
|
PROC SORT DATA=file-1 OUT=file-1;
BY name;
RUN;
PROC SORT DATA=file-2 OUT=file-2;
BY name;
RUN;
DATA file-3;
MERGE file-1 file-2; /*file-1:MASTER、file-2:TRAN*/
BY name;
RUN;
複数のデータセットを指定した場合、横に結合したイメージでオープンされます。
この場合、file-1のよこにfile-2のオブザベーションが追加されます。
読み込みは、[MASTER]のオブザベーション、次に[TRAN]のオブザベーションが読み込まれ処理されます。
両者に同じ変数名がある場合は[TRAN]の内容で[MASTER]の内容が更新されます。
その際、BYグループ(By 変数名・・)が変るとき以外はそれ以外の変数の値は初期化されません。
データの結合をする前に、結合するキーとなる変数で並べ替え(ソート)をしておく必要があります。
Magazines :SAS Customor Support / Technical
Supportに関連記載がありますので参照してください
|
|
file-1
|
name |
sex |
age |
行1 |
X1 |
F |
Z1 |
行2 |
X2 |
F |
Z2 |
行3 |
X2 |
F |
25 |
行4 |
X3 |
M |
Z3 |
|
file-2
|
name |
sex |
hobby |
行1 |
X1 |
F |
H1 |
行2 |
X2 |
F |
H2 |
行3 |
X4 |
M |
H4 |
|
→ |
file-3
|
name |
sex |
age |
hobby |
行1 |
X1 |
F |
Z1 |
H1 |
行2 |
X2 |
F |
Z2 |
H2 |
行3 |
X2 |
F |
Z5 |
H2 |
行4 |
X3 |
M |
Z3 |
|
行5 |
X4 |
M |
|
H4 |
|
|
|
file-1のX2が重複した場合(file-1とfile-2の同一キーの件数が異なる場合)、file-3のhobbyはfile-2の前行のものがセットされる。この場合ログには警告メッセージが出力される。 |
|
|
|
DATA data3;
MERGE data2 data1;
BY キー変数;
RUN;
※data1 :MASTER data2:TRAN(MASTER1に対してN件ある) |
|
|
|
|
|
|
|
Masterデータセットの値をTransactデータセットの値で更新する場合に用います。更新されたSAS
データセットは別のデータセットに作成されます。
DATA file-3;
UPDATE file-1 file-2; /*file-1:MASTER、file-2:TRAN*/
BY ID;
RUN; |
|
|
|
|
PROC COPY IN=v6lib OUT=v8lib DATECOPY ;
RUN ; |
|
|
|
|
PROC SORT data=入力SASデータセット名 [out=出力SASデータセット名];
BY キー(並べ替えの基準とする変数);
RUN; |
|
|
|
|
SASはプログラム中で変数を宣言するタイミングが早い順番に変数の並び順が決定されます。
この規則を応用することで、データセット内の変数の順番を任意に指定できます。
もし、同じ変数に対する宣言が複数ある場合には、より早い宣言が有効になります。
【LENGTHステートメントを使用する方法】
DATA sample1;
LENGTH weight 8 height 8 age 8 sex
$ 1 name $ 8;
SET testdata1;
RUN;
【FORMATステートメントを使用する方法】
変数の定義順序を指定するために、変数の出力形式(フォーマット)を定義するFORMATステートメントを利用します。
DATA sample2;
FORMAT weight height age sex name;
SET testdata2;
RUN; |
|
|
|
|
|
(SASデータセットの内容を外部ファイルに出力する) |
|
|
FILEステートメントと PUTステートメントを組み合わせることて、SAS データセットの内容を外部ファイルに出力することができます。
DATA _NULL_; /*データセットを作らないときにダミーとして_null_を指定*/
SET SASデータセット名;
/*データセットsampleを読み込む*/
FILE "パス名+CSVファイル名" DSD;
/*外部ファイルに出力*/
PUT 変数1 変数2 $ 変数3 $ ・・・;
/*書き出す変数を指定*/
RUN;
※FILE のオプションとしてDSDを指定するとCSVファイルを出力することができます。
DSDオプションの指定がない場合は各変数の値の間にはスペースが入る。
※PUT @15 変数名・・・ のようにカラム指定することも可 |
|
|
|
|
EXPORT プロシジャを用いて、SAS データセットの内容をCSV
形式ファイルにします。
【カンマ区切りのテキストファイル:一行目に変数名を表示】
PROC EXPORT DATA = SASデータセット名
OUTFILE= "パス名+CSVファイル名"
DBMS=CSV REPLACE;
RUN;
※CSVファイルの一行目には変数名が表示されます。
EXPORTプロシジャでは、ラベルを出力することはできません。
ラベルを出力するためには、PRINTプロシジャでLABELオプションを使用し、
ODS(アウトプット・デリバリ・システム)
CSVステートメントと併用することでラベル表示が行えます。
【カンマ区切りのテキストファイル:一行目にラベル名を表示】
ODS LISTING CLOSE;
ODS CSV FILE="パス名+CSVファイル名";
PROC PRINT DATA=SASデータセット名 LABEL NOOBS;
RUN;
ODS CSV CLOSE;
ODS LISTING;
【タブ区切りのテキストファイル】
PROC EXPORT DATA = sample
OUTFILE="sample.csv"
REPLACE;
RUN;
※TAB区切りのテキストファイルとして作成される。
※DBMS=EXCEL 指定は、SAS/ACESS
Interface to PC file Formatsのライセンスが必要です。; |
|
|
|
|
DDE の機能(Base SAS)を使用してExcelシートに書き込む
(EXPORTプロシジャで簡単に実現できるがSASオプションのライセンス契約が必要)
/* EXCELを起動 */
OPTIONS NOXWAIT NOXSYNC;
X "start C:\sample.xlsxl";
DATA _null_;
x=SLEEP(10); /* Excelの起動を10秒待機 */
RUN;
/* Excelへデータを書き込む */
FILENAME data dde "excel | sheet1!r1c1:r3c3"
notab; /* range は RC 形式でも A1 形式でもよい*/
DATA SASデータセット名;
SET file-1;
file data dsd dlm='09'x; /* ファイル書き込み */
PUT tanka suryo total;
RUN;
/* シートに名前を付けて保存し、EXCELを終了
*/
OPTIONS NOXWAIT XSYNC;
FILENAME data dde 'excelsystem'; /* VBAが実行できるようになる
*/
DATA _null_;
FILE data;
PUT [SAVE.AS(C:\sample.xlsxl)];
PUT [QUIT()];
RUN;
OPTIONS XWAIT XSYNC;
<DDEオプション>
notab : Excelから送られたデータ中のタブをスペースに変換しないようにする。
dlm= : 区切り文字を指定。'09'xはタブ文字の16進文字コード。
例) Excel…DLM='09'x;
DSD : 区切り文字が2つ連続した場合に欠損値として扱う。デフォルト区切り文字はコンマ。
MISSOVER : INPUTステートメントが現在のレコードの終わりに到達した時に
見つからなかった変数値が欠損値として設定される。
lrecl : レコード長をバイト単位で指定します。Windowsでのデフォルト値は256。
record-lengthの値は、1〜1,048,576(1MB)の範囲で指定できる。
SAS社 Customer Support / Technical Support に記載がありますので参照してください。
※参考 SASシステムとExcelとのデータ交換(DDE) |
|
|
file-1
|
tanka |
suryo |
total |
行1 |
X1 |
Y1 |
Z1 |
行2 |
X2 |
Y2 |
Z2 |
行3 |
X3 |
Y3 |
Z3 |
|
|
|
|
(その他のファイル操作) |
|
|
DATA file-2;
SET file-1;
total = tanka * suryo;
RUN;
file-1の、tanka、suryoからtotalを計算し、file-2を作成する |
|
file-1
|
tanka |
suryo |
行1 |
X1 |
Y1 |
行2 |
X2 |
Y2 |
行3 |
X3 |
Y3 |
|
→ |
file-2
|
tanka |
suryo |
total |
行1 |
X1 |
Y1 |
Z1 |
行2 |
X2 |
Y2 |
Z2 |
行3 |
X3 |
Y3 |
Z3 |
|
|
「任意の変数の後に変数を追加する」方法は、
Magazines :SAS Technical News Winter 2006 の「Q&A」に記載がありますので参照してください |
|
|
|
|
DATA file-2;
SET file-1;
DROP tanka;
RUN;
または
DATA file-2;
SET file-1;
KEEP suryo;
RUN; |
|
file-1
|
tanka |
suryo |
行1 |
X1 |
Y1 |
行2 |
X2 |
Y2 |
行3 |
X3 |
Y3 |
|
→ |
file-2
|
|
|
|
|
DATA file-2;
SET .file-1.. (WHERE=(tanka=条件1));
RUN; |
|
|
|
|
|
COMPAREプロシジャは、同名の変数をもつデータセットを比較します。
文法
PROC COMPARE BASE=file-1 COM=file-2 ALLOBS; /*全オブザベーション対象として比較*/
VAR (変数1) (変数2) 〜; /*file-1コンペアする変数を指定(変数を絞って比較)*/
WITH (変数1) (変数2) 〜; /*file-2コンペアする変数を指定:file-1と変数名が異なる時に使用*/
ID < VAR/ABLES ;
BY (変数1) (変数2) 〜; /* キーを使ってコンペアを行う */
RUN;
例
PROC COMPARE BASE=data1 COMP=data2 OUT=diff OUTNOEQUAL OUTBASE OUTCOMP;
RUN;
PROC PRINT DATA=diff;
RUN;
各オプションの説明
OUT= 出力データセット名
OUTNOEQUAL すべての値が一致しているときは、オブザベーションを表示しない
OUTBASE BASE=で指定したデータセットのオブザベーションを表示する
OUTCOMP COMPARE=で指定したデータセットのオブザベーションを表示する
【COMPAREプロシジャを使用しない方法】
DATA SASデータセット3;
MERGE SASデータセット1
SASデータセット2(RENAME=(変数名1=変数名1X
・・・・));
BY キー変数;
RUN;
DATA usrlib.VitalSignsd;
SET SASデータセット1;
IF 変数名1='.' and ・・・・・
THEN
DO;
PUT キー変数 'aファイルなし';
RETURN;
END;
IF 変数名1X='.' and ・・・・・ THEN
DO;
PUT キー変数 'bファイルなし';
RETURN;
END;
IF 変数1 NE 変数1X THEN
PUT キー変数
'測定日' 変数1 変数1X;
IF 変数1 NE 変数1X THEN OUTPUT;
・・・
RUN; |
|
|
|
SORTプロシジャのDUPOUT=オプションを利用することで。キーが重複するオブザベーションの2件目以降を別のデータセットに出力することができます。
PROC SORT DATA=data1 OUT=uni DUPOUT=dup
NODUPKEY;
BY キー変数;
RUN; |
|
|
|
|
SORTプロシジャでNODUPKEYオプションを使用することにより、キーが重複するオブザベーションを削除することができます。
PROC SORT DATA=入力SASデータセット名 [out=出力SASデータセット名]
nodupkey;
BY キー変数;
RUN; |
|
|
|
|
DATA sample;
SET sample;
BY patid;
IF FIRST.patid THEN ・・・・;
RUN; |
|
|
|
|
DATA sample;
SET sample;
BY patid;
IF LAST.patid THEN ・・・・;
RUN; |
|
|
|
|
SAS社FAQサイト Technical Support Frequently
Asked Questions に記載があります |
|
|
|
Magazines :SAS Technical News Spring 2005 の「Q&A」を参照してください |
|
|
|
SAS System 9から、テキストをログへ出力する機能を持つPUTLOGステートメントがサポートされています
DATA _null_;
SET sashelp.class END=eof;
FILE 'C:\MyFiles\class.txt';
PUT name sex age; /*変数name,sex,age をログに出力します*/
IF eof THEN /* ファイル終了? */
PUTLOG '*** ' _n_ '件 ***'; /* 件数をログへ出力します */
/*
_n_ は自動変数。DATAステップの処理が何回目かを表します。
RUN;
SASサポートの「Q&A」に記載がありますので参照してください |
|
|
|
|
DATA _null_;
SET sample;
IF _N_ = 1 THEN PUTLOG '*** START ***'; /* 自動変数(DATAステップの処理が何回目かを表す変数)を判定します*/
RUN; |
|
|
|
|
DATA _null_;
SET sample END=eof; /*データセットが最終行に達すると変数eofが真にセットされる*/
IF eof THEN PUTLOG '*** ' _n_ '件 ***'; /* PUTLOGステートメント */
RUN; |
|