データステップでのデータの読み込み?について基本的な機能を紹介します
次の2文は,ステップ外で単独で使える文です
options nocenter compress=yes; /*アウトプット画面を左寄せ,データセットは圧縮記録せよと指示*/
libname mydata "c;\"; /*ライブラリmydataを定義*/
ヘルプ
オプション文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >システムオプション
ライブラリ文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>libnameステートメント
INFILE文とINPUT文,FILE文とPUT文,外部ファイルの読み込み
プログラムの後ろに書かれたデータ行からのデータの読み込み,
それを,いったん外部のテキストファイルに書き出し,
もう一度,外部ファイルとしてデータを読み込んでみます.
INFILE文とINPUT文
data sample; infile cards; /*インファイル文.読み込むデータファイルを指定. 省略した場合は,カード文の後ろからセミコロンまでをデータ行とみなす ので,この場合は普通省略する */ input ID name $ sex $; /* インプット文.読み込むデータを割り当てる変数を指定. ID, name ,sex の3変数を読み込む. $マークは,前の変数には文字データを,そうでなければ数値データを 読むことを指定.データは特に指定がなければ,空白を区切りとして,順に割 り当てられる*/ cards; 001 fujita M 002 suzuki F 003 takahashi M 004 tanaka M ; proc print;run;
アウトプットウィンドウに以下が表示されます
OBS ID name sex
1 1 fujita M 2 2 suzuki F 3 3 takahashi M 4 4 tanaka M
FILE文とPUT文
data _null_; /*データセットを作らないときにダミーとして_null_を指定*/ set sample; /*データセットsampleを読み込む*/ file "c:\sample.txt"; /*外部ファイルに出力*/ put ID name $ sex $; /*書き出すデータを指定*/ run;
外部ファイル c:\sample.txtの内容
1 fujita M 2 suzuki F 3 takahashi M 4 tanaka M
外部ファイルの読み込み
data newsamp; infile "c:\sample.txt"; /*外部ファイルから入力*/ input ID name $ sex $; /*読み込むデータを指定*/ run;
proc print data=newsamp;run;
アウトプットウィンドウに以下が表示されます
OBS ID name sex
1 1 fujita M 2 2 suzuki F 3 3 takahashi M 4 4 tanaka M
変数タイプとフォーマット
データセットの変数には,2種類のタイプしかありません.
数値タイプと文字タイプです.
特に宣言しなければ,初めてその変数が現れたときに,プログラムの文脈から適切なタイプとその長さ(バイト数)が,選ばれます.
- つぎの例では,読み込むデータに,最寄駅(station)と定期代(expense)を追加しています.
data sample; input ID name $ sex $ station $ expense; cards; 001 fujita M iidabashi 6,160 002 suzuki F shimokitazawa 13,650 003 takahashi M funabashi 17,800 004 tanaka M yokohama 15,830 ;
proc print;run;
OBS ID name sex station expense
1 1 fujita M iidabash . 2 2 suzuki F shimokitazawa . 3 3 takahashi M funabashi . 4 4 tanaka M tachikaw .
今までどおりの流儀で読むと,stationは,途中で切られ,expenseには,データが正しく読み込まれていません.
これは,SASが読み込む変数の長さが類推できなかったので,文字は8文字まで,数字は,カンマの入っていない数字列を期待したからです.
このような場合は,変数に明示的に長さや読み込むデータの表記形式を指定します.
変数に明示的に長さや読み込むデータの表記形式を指定
読み込む表記形式を入力形式(informat?インフォーマット)といい,それを指定することによって,
同じ数値でも,カンマ付数字や,16進表現,そのほか特別な表記でも読み込むことができます.
data sample; informat station $10.; /*文字10文字*/ informat expense comma10.; /*カンマ付数字10桁*/ input ID name $ sex $ station $ expense; cards; 001 fujita M iidabashi 6,160 002 suzuki F shimokitazawa 13,650 003 takahashi M funabashi 17,800 004 tanaka M yokohama 15,830 ;
proc print;run;
OBS station expense ID name sex
1 iidabashi 6160 1 fujita M 2 shimokitazawa 13650 2 suzuki F 3 funabashi 17800 3 takahashi M 4 yokohama 15830 4 tanaka M
うまく読めましたが,気になる点が3点あります.
1.expenseの値にコンマがなくなった.
2.変数の順序が読み込み順と違う.
3.(前からだが),IDのゼロがサプレスされている.
1と3の理由は,先に述べたとおりSASは数値は,ひとつのタイプしかもっていないため,
読み込む数値が,どのような形式でも,内部表現は1通りになってしまうからです.
1,001も,01001も読んでしまえば,1001です.
2の理由は,IDやnameよりも先に,(informat文のところで)stationとexpenseが現れるからです.
表示する形式も,元のデータと同じようにしたければ,出力形式をフォーマット文で定義しておきます.
data sample; format ID Z3.; /*zero付3桁の数値*/ informat name $10.; informat sex $1.; informat station $10.; informat expense comma10.; format expense comma10.; /*コンマ付10桁の数値*/ input ID name $ sex $ station $ expense; cards; 001 fujita M iidabashi 6,160 002 suzuki F shimokitazawa 13,650 003 takahashi M funabashi 17,800 004 tanaka M yokohama 15,830 ; proc print;run;
OBS ID name sex station expense
1 001 fujita M iidabashi 6,160 2 002 suzuki F shimokitazawa 13,650 3 003 takahashi M funabashi 17,800 4 004 tanaka M yokohama 15,830
infile?文,input?文,informat?文が理解できれば,簡単なテキストファイルからのデータの読み込みはできるようになります.
それぞれもっと複雑な場合の指定の仕方がありますので,ヘルプを参照してください.
infile?文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>infileステートメント
input?文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>inputステートメント
informat?文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>informatステートメント
入力形式
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス > 入力形式
また,エクセル,オラクルなど他のデータベースとのやり取りも可能です.
ファイルメニュー>データのインポート
や,downloadプロシージャ,SAS/ACCESSプロダクトなどいくつかの手段が用意されています.
インフォーマット?
代入文?
演算子
関数?
フォーマット?
データセットオプション
質問・意見
質問・意見一覧
以下は、SASのエディタWINDOWでコピペして使えます
/*
データステップでのデータの読み込みについて基本的な機能を紹介します
*/
/*次の2文は,ステップ外で単独で使える文です*/
options nocenter compress=yes; /*アウトプット画面を左寄せ,データセットは圧縮記録せよと指示*/
libname mydata "c;\"; /*ライブラリmydataを定義*/
/*
ヘルプ
オプション文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >システムオプション
ライブラリ文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>libnameステートメント
*/
/*
INFILE文とINPUT文,FILE文とPUT文
プログラムの後ろに書かれたデータ行からのデータの読み込み,
それを,いったん外部のテキストファイルに書き出し,
もう一度,外部ファイルとしてデータを読み込んでみます.
*/
data sample;
infile cards; /*インファイル文.読み込むデータファイルを指定.
省略した場合は,カード文の後ろからセミコロンまでをデータ行とみなす
ので,この場合は普通省略する
*/
input ID name $ sex $; /* インプット文.読み込むデータを割り当てる変数を指定.
ID, name ,sex の3変数を読み込む.
$マークは,前の変数には文字データを,そうでなければ数値データを
読むことを指定.
データは特に指定がなければ,空白を区切りとして,順に割り当てられる.
*/
cards;
001 fujita M
002 suzuki F
003 takahashi M
004 tanaka M
;
/*
proc print;run;
OBS ID name sex
1 1 fujita M
2 2 suzuki F
3 3 takahashi M
4 4 tanaka M
*/
data _null_; /*データセットを作らないときにダミーとして_null_を指定*/
set sample; /*データセットsampleを読み込む*/
file "c:\sample.txt"; /*外部ファイルに出力*/
put ID name $ sex $; /*書き出すデータを指定*/
run;
/*
c:\sample.txtの内容
1 fujita M
2 suzuki F
3 takahashi M
4 tanaka M
*/
data newsamp;
infile "c:\sample.txt"; /*外部ファイルから入力*/
input ID name $ sex $; /*読み込むデータを指定*/
run;
/*
proc print data=newsamp;run;
OBS ID name sex
1 1 fujita M
2 2 suzuki F
3 3 takahashi M
4 4 tanaka M
*/
/*
変数タイプとフォーマット
データセットの変数には,2種類のタイプしかありません.
数値タイプと文字タイプです.
特に宣言しなければ,初めてその変数が現れたときに,
プログラムの文脈から適切なタイプとその長さ(バイト数)が,
選ばれます.
つぎの例では,読み込むデータに,最寄駅(station)と定期代(expense)
を追加しています.
*/
data sample;
input ID name $ sex $ station $ expense;
cards;
001 fujita M iidabashi 6,160
002 suzuki F shimokitazawa 13,650
003 takahashi M funabashi 17,800
004 tanaka M yokohama 15,830
;
proc print;run;
/*
OBS ID name sex station expense
1 1 fujita M iidabash .
2 2 suzuki F shimokitazawa .
3 3 takahashi M funabashi .
4 4 tanaka M tachikaw .
今までどおりの流儀で読むと,stationは,途中で切られ,
expenseには,データが正しく読み込まれていません.
これは,SASが読み込む変数の長さが類推できなかったので,
文字は8文字まで,数字は,カンマの入っていない数字列を期待したからです.
このような場合は,変数に明示的に長さや読み込むデータの表記形式を指定します.
読み込む表記形式を入力形式(インフォーマット)といい,それを指定することによって,
同じ数値でも,カンマ付数字や,16進表現,そのほか特別な表記でも読み込むことができます.
*/
data sample;
informat station $10.; /*文字10文字*/
informat expense comma10.; /*カンマ付数字10桁*/
input ID name $ sex $ station $ expense;
cards;
001 fujita M iidabashi 6,160
002 suzuki F shimokitazawa 13,650
003 takahashi M funabashi 17,800
004 tanaka M yokohama 15,830
;
proc print;run;
/*
OBS station expense ID name sex
1 iidabashi 6160 1 fujita M
2 shimokitazawa 13650 2 suzuki F
3 funabashi 17800 3 takahashi M
4 yokohama 15830 4 tanaka M
*/
/*
うまく読めましたが,気になる点が3点あります.
1.expenseの値にコンマがなくなった.
2.変数の順序が読み込み順と違う.
3.(前からだが),IDのゼロがサプレスされている.
1と3の理由は,先に述べたとおりSASは数値は,ひとつのタイプしかもっていないため,
読み込む数値が,どのような形式でも,内部表現は1通りになってしまうからです.
1,001も,01001も読んでしまえば,1001です.
2の理由は,IDやnameよりも先に,(informat文のところで)stationとexpenseが現れるからです.
表示する形式も,元のデータと同じようにしたければ,出力形式をフォーマット文で定義しておきます.
*/
data sample;
format ID Z3.; /*zero付3桁の数値*/
informat name $10.;
informat sex $1.;
informat station $10.;
informat expense comma10.;
format expense comma10.; /*コンマ付10桁の数値*/
input ID name $ sex $ station $ expense;
cards;
001 fujita M iidabashi 6,160
002 suzuki F shimokitazawa 13,650
003 takahashi M funabashi 17,800
004 tanaka M yokohama 15,830
;
proc print;run;
/*
OBS ID name sex station expense
1 001 fujita M iidabashi 6,160
2 002 suzuki F shimokitazawa 13,650
3 003 takahashi M funabashi 17,800
4 004 tanaka M yokohama 15,830
*/
/*
infile文,input文,informat文が理解できれば,簡単なテキストファイルからの
データの読み込みはできるようになります.
それぞれもっと複雑な場合の指定の仕方がありますので,ヘルプを参照してください.
infile文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>infileステートメント
input文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>inputステートメント
informat文
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス >ステートメント>informatステートメント
入力形式
ヘルプメニュー>SASヘルプとドキュメント>目次>SASプロダクト>BaseSAS
>SAS言語レファレンス>SAS言語レファレンス > 入力形式
また,エクセル,オラクルなど他のデータベースとのやり取りも可能です.
ファイルメニュー>データのインポート
や,downloadプロシージャ,SAS/ACCESSプロダクトなどいくつかの手段が用意されています.
*/
/*
インフォーマット
代入文
演算子
関数
フォーマット
データセットオプション
*/
*****************************************************************
END
*****************************************************************;