INPUTステートメント

Last-modified: 2008-06-25 (水) 01:24:30

INPUTステートメントは,CARDSステートメントに続くデータ行やINFILEステートメントで指定された外部データファイルから,データをSASデータセットに読み込みます.

INPUT 入力指定 ;
INPUT name $ age sex ; /*シンプルな例*/
INPUT @10 name $char10. @25 birthday : yymmdd10. sex $1.; /*すこし込み入った例*/

INPUTに続く入力指定では,変数やインフォーマット,ポインタ制御記号などを使ってデータの構造にあったデータの読み込み方法を指定します.入力指定の構成要素は以下のとおりです.
入力指定の構成要素

  • 変数・・・読み込んだデータを格納する変数名
  • $・・・インフォーマットを指定せずに文字データを読む場合に変数の後ろに記述
  • インフォーマットと修飾子など・・・読み込むデータの長さと形式を指定
  • カラム指定・・・読み込むカラム位置を指定
  • ポインタ制御・・・ポインタ(読み込み位置)を移動させる

これらの構成要素を組み合わせた入力指定の形式には,次にあげる5つの入力スタイルがあり,どれか1つまたは,複数種類の入力スタイルを並べて,データレコードの読み込み方法を指定します.なお,各入力スタイルの先頭とINPUTステートメントの最後にはポインタ制御記号を書く事ができます.

  • リスト入力 空白で区切りのデータを読み込みます
  • 修飾子入力 空白で区切りのデータを指定したインフォーマットで読み込みます
  • カラム入力 カラム位置を指定してデータを読み込みます.
  • フォーマット入力 インフォーマットを指定してデータを読み込みます.
  • 名前入力 「変数=値」形式のデータを読み込みます.

以上から,入力指定は,以下のような構造をとる事になります.

INPUT <ポインタ制御> 入力スタイル1 .. <ポインタ制御> 入力スタイル2 .. <ポインタ制御>;

入力スタイル

5つの入力スタイルを以下にしめします.変数の繰り返しは原則省略してあり,1変数分の読み込みで記述しています.また各入力スタイルの先頭とINPUTステートメントの最後にはポインタ制御記号を書く事ができますがこれも省略しています.

  • リスト入力スタイル
    INPUT  変数 <$> ;   /*空白で区切られたデータを順に読む.文字型変数には$をつけること*/
    INPUT  変数  $ & ;  /*空白を含む文字データを読む*/
    もっとも簡単な読み込み方法で,データが空白で区切られており,文字データは対応する変数のバイト長(省略時は8バイト)以下であれば,変数をリストするだけ(文字変数には$を後置)で読み込む事ができます.
  • 修飾子入力スタイル
    INPUT  変数  : インフォーマット. ;  /*指定したインフォーマットで読む*/
    INPUT  変数  & インフォーマット. ;  /*指定したインフォーマットで空白を含む文字データを読む*/
    INPUT  変数  ~ インフォーマット. ;  /*クォートされた文字列を指定したインフォーマットで読む*/
    データが空白区切であっても,読み込むデータが,日付だったり,8バイトより長い文字,空白を含むデータなどリスト入力で読めない場合,読み込むためのインフォーマットやその修飾子をつけて読み込みます.
  • カラム入力スタイル
    INPUT  変数 <$> 開始カラム番号- ;                           /*開始カラムからデータを読む*/
    INPUT  変数 <$> 開始カラム番号-終了カラム番号  ;           /*開始カラムから終了カラムまでを1データとして読む*/
    INPUT  変数     開始カラム番号-終了カラム番号 .小数桁数 ; /*小数点のない数字列の小数点桁数を指定*/
    データの書かれてるカラム位置がそろっている場合,カラム位置を指定する事で読み込みを指示します.データが区切られていなくてもかまいません.
  • フォーマット入力スタイル
    INPUT  変数 インフォーマット. ;                     /*指定したインフォーマットで読む.空白区切りは考慮されない*/
    INPUT (変数1 変数2 ..) (インフォーマット1.インフォーマット2 ..) ;   /*複数の変数を対応するインフォーマットで読む.*/
    INPUT (変数1 変数2 ..) (インフォーマット.) ;       /*複数の変数を指定したインフォーマットで読む.*/
    INPUT (変数1 変数2 ..) ( n*インフォーマット.) ;    /*インフォーマットの繰り返し指定*/
    インフォーマットの指定する長さ分の領域から,そのインフォーマットの入力形式でデータを読み込みます.各々のデータに対応するインフォーマットの長さにデータレコードが整合していれば,データが区切られていなくてもかまいません.
  • 名前入力スタイル
    INPUT  変数= <$> ;                                   /*変数=値の形式のデータを読む*/
    INPUT  変数= インフォーマット. ;                     /*変数=値の形式のデータをフォーマット入力で読む*/
    INPUT  変数= <$> 開始カラム番号- ;                   /*変数=値の形式のデータをカラム入力で読む*/
    INPUT  変数= <$> 開始カラム番号-終了カラム番号  ;    /*変数=値の形式のデータをカラム入力で読む*/
    INPUT  変数=     開始カラム番号-終了カラム番号 .小数桁数 ;/*変数=値の形式のデータをカラム入力で読む*/
    読み込む変数名自体がデータレコードに含まれていて,「=」でデータ値と並んでいるようなデータに対して,リスト入力,インフォーマット入力,カラム入力を行う事ができます.これは,PUTステートメントで名前出力したデータを読み直す場合に便利です.

ポインタ制御

カラムポインタ制御

  • 左端からnカラム目にポインタを移動.数値変数や,数値演算式の場合は,その値の示すカラム位置に移動.
    @n
    @数値変数
    @(数値演算式)
  • 左端から文字列に合致するデータの次にポインタを移動.文字変数や,文字演算式の場合は,その値に合致するデータの次にカラム位置に移動.
    @'文字列'
    @文字変数
    @(文字演算式)
  • 現在の位置から左へnカラム移動.数値変数や,数値演算式の場合は,その値分カラムを移動.
    +n
    +数値変数
    +(数値演算式)

ラインポインタ制御

  • 読み込み開始行を1として,n番目の行にポインタを移動.数値変数や,数値演算式の場合は,その値の示す行に移動.
    #n
    #n数値変数
    #n(数値演算式)
  • 次の行にポインタを移動.
    /

ライン保持子

  • INPUT終了後も,現在の行を保持し,次の行に移らない.@は,同一DATAステップ内で有効.@@は,次のDATAステップまで有効.いずれも,INPUTステートメントの最後に,一方だけ書く事ができる.
    @
    @@

空INPUTステートメント