SAS入門2

Last-modified: 2016-01-06 (水) 12:38:56

データステップでのデータの読み込み?について基本的な機能を紹介します

次の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プロダクトなどいくつかの手段が用意されています.
インフォーマット?
代入文?
演算子
関数?
フォーマット?
データセットオプション

質問・意見

サマリ 質問の要旨を簡潔にお願いします。
お名前
状態
メッセージ

質問・意見一覧

状態
↑(1)
サマリ投稿者ページ名[_past]
informat とformatの違いは?anonymous?SAS入門2/2[_past]
テストSAS入門2/1[_past]

以下は、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
*****************************************************************;