前のページ|次のページ

INPUTステートメント

入力データレコードでの値の位置を指定し、読み込んだ値を対応するSAS変数に割り当てます。

該当要素: DATAステップ
カテゴリ: ファイル操作
種類: 実行

構文

INPUT <specification(s)> <@ | @@>;

引数なし

引数を指定しないINPUTステートメントは、ヌルINPUTステートメントと呼ばれます。ヌルINPUTステートメントは、次の場合に使用します。
  • SAS変数を作成せずに、入力データレコードを入力バッファに読み込む場合
  • 後置@または後置@@で保持されている入力データレコードを解放する場合
この例については、 ヌルINPUTステートメントを使用するを参照してください。

引数

specification(s)

次を指定できます。

variable

読み込む値を割り当てる変数名を1つ指定します。

(variable-list)

読み込む値を割り当てる変数名のリストを指定します。

要件 (variable-list)の後ろに(informat-list)を指定します。
参照項目 変数と入力形式をグループ化する方法

$

変数の値を数値ではなく文字値として格納するように指定します。

ヒント この変数が文字変数と事前に定義されている場合、$を指定する必要はありません。
INPUTステートメントで複数のスタイルを使用する

pointer-control

入力バッファ内の指定した行または列に入力ポインタを移動させます。

参照項目 カラムポインタコントロール および 行ポインタコントロール

column-specifications

読み込む値が含まれる入力レコードの列を指定します。

ヒント 入力形式は無視されます。この方法では、標準の文字データと数値データのみ正しく読み込めます。
参照項目 カラム入力
INPUTステートメントで複数のスタイルを使用する

format-modifier

修飾リスト入力を使用できるようにします。また、入力値にエラーが発生したときにSASログに出力する情報の量を制御します。

ヒント 修飾リスト入力を使用すると、単純リスト入力では読み込めないデータを読み込めます。
参照項目 リスト入力の使用が求められる場合 およびエラーレポートのフォーマット修飾子
文字変数でポインタの位置を指定する

informat.

変数の値の読み込みに使用する入力形式を指定します。

ヒント 修飾リスト入力を使用すると、入力形式を指定したデータを読み込めます。修飾リスト入力は、データに入力形式が必要ですが、値の列位置が揃っていないためフォーマット入力ではデータを読み込めない場合に使用すると便利です。
参照項目 フォーマット入力 および リスト入力
入力形式リストを使用する

(informat-list)

入力形式のリストを指定します。このリストは、前の位置に指定した変数リストの値の読み込みに使用します。

制限事項 (informat-list)は(variable-list)の後ろに指定する必要があります。
参照項目 変数と入力形式をグループ化する方法

@

次のINPUTステートメントの実行時に使用できるように入力行を保持します。DATAステップの同一の反復内で保持されます。このラインホールド指定子は、後置@と呼ばれます。

制限事項 後置@は、INPUTステートメントの最後の項目として指定する必要があります。
ヒント 後置@を指定すると、次のINPUTステートメントによって、現在の入力レコードの開放や入力バッファへの次のレコードの読み込みが自動的に実行されなくなります。後置@は、同じレコードを何度も読み込む必要がある場合に便利です。
参照項目 ラインホールド指定子の使用
入力バッファ内のレコードを保持する

@@

次のINPUTステートメントの実行時に使用できるように入力行を保持します。DATAステップの反復間を通して保持されます。このラインホールド指定子は、後置@@と呼ばれます。

制限事項 後置@@は、INPUTステートメントの最後の項目として指定する必要があります。
ヒント 後置@@は、それぞれの入力行に複数のオブザベーションの値が含まれる場合や、DATAステップの次の繰り返しでレコードをもう一度読み込む必要がある場合に便利です。
参照項目 ラインホールド指定子の使用
DATAステップの反復間を通してレコードを保持する

カラムポインタコントロール

@n

ポインタを列nに移動させます。

範囲 正の整数
ヒント nが整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。nが0または負の場合、ポインタは列1に移動します。
@15と指定すると、ポインタは列15に移動します。
input @15 name $10.;
ポインタを後方(左)に移動する

@numeric-variable

指定したnumeric-variableの値が示す列にポインタを移動させます。

範囲 正の整数
ヒント numeric-variableの値が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。numeric-variableの値が0または負の整数の場合、ポインタを列1に移動させます。
変数Aの値に従って、ポインタは列15に移動します。
a=15;
input @a name $10.;
数値変数でポインタの位置を指定する

@(expression)

指定したexpressionの値が示す列にポインタを移動させます。

制限事項 expressionの実行結果は正の整数でなければなりません。
ヒント expressionの実行結果が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。値が0または負の整数の場合、ポインタを列1に移動させます。
式の実行結果に従って、ポインタを列15に移動します。
b=5;
input @(b*3) name $10.;

@'character-string'

指定したcharacter-stringを入力レコードから検索し、検出された文字列の終わりから1番目の列にポインタを移動させます。

@character-variable

指定したcharacter-variableの値が示す文字列を入力レコードから検索し、検出された文字列の終わりから1番目の列にポインタを移動させます。

次のステートメントでは、文字変数WEEKDAYを読み込みます。2番目に指定した@1に従って、ポインタを入力行の先頭に移動させます。変数SALESの値は、変数WEEKDAYの値の後方の非ブランク列から読み込まれます。
input @1 day 1. @5 weekday $10.
   @1 @weekday sales 8.2;
文字変数でポインタの位置を指定する

@(character-expression)

指定したcharacter-expressionの値が示す文字列を入力レコードから検索し、検出された文字列の終わりから1番目の列にポインタを移動させます。

文字変数でポインタの位置を指定する

+n

nに指定した列数だけポインタを移動させます。

範囲 正の整数または0
ヒント nが整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。この値が入力バッファの長さを超える場合、ポインタは次のレコードの列1に移動します。
次のステートメントでは、ポインタを列23に移動させます。LENGTH変数の値として列23から26までを読み込みます。次に、ポインタを5列右に移動させ、WIDTH変数の値として列32から35までを読み込みます。
input @23 length 4. +5 width 4.;
ポインタを後方(左)に移動する

+numeric-variable

指定したnumeric-variableの値が示す列数だけポインタを移動させます。

範囲 正の整数、負の整数、または0
ヒント numeric-variableの値が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。numeric-variableの値が負の値の場合、ポインタを後方(左)へ移動させます。ただし、現在の列位置が1未満になる場合、ポインタは列1に移動します。値が0の場合、ポインタは移動しません。この値が入力バッファの長さを超える場合、ポインタは次のレコードの列1に移動します。
ポインタを後方(左)に移動する

+(expression)

指定したexpressionの値が示す列数だけポインタを移動させます。

範囲 expressionの実行結果が、正の整数、負の整数または0になる式を指定します。
ヒント expressionの実行結果が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。expressionの実行結果が負の値の場合、ポインタを左に戻します。ただし、現在の列位置が1未満になる場合、ポインタは列1に移動します。値が0の場合、ポインタは移動しません。この値が入力バッファの長さを超える場合、ポインタは次のレコードの列1に移動します。

行ポインタコントロール

#n

ポインタをレコードnに移動させます。

範囲 正の整数
操作 INFILEステートメントのN=オプションの値によって、INPUTステートメントで読み込むレコード数や、DATAステップの繰り返しを終了した後の入力ポインタの位置は異なります。N=オプションの説明を参照してください。
#2と指定されているので、ポインタは2番目のレコードに移動してから、変数IDの値として列3と4を読み込みます。
input name $10. #2 id 3-4;

#numeric-variable

指定したnumeric-variableの値が示すレコードにポインタを移動させます。

範囲 正の整数
ヒント numeric-variableの値が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。

#(expression)

指定したexpressionの値が示すレコードにポインタを移動させます。

範囲 expressionの実行結果は正の整数でなければなりません。
ヒント expressionの実行結果が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。

/

ポインタを次の入力レコードの列1に移動させます。

最初の入力レコードから変数NAMEと変数AGEの値を読み込みます。次に、ポインタを2番目のレコードに移動し、変数IDの値として列3と4を読み込みます。
input name age / id 3-4;

エラーレポートのフォーマット修飾子

?

無効なデータ値が検出されたときに、無効なデータに関するメッセージを出力しないようにします。

参照項目 無効なデータの処理方法

??

無効なデータ値が検出されたときに、メッセージと該当する入力行を出力しないようにします。この無効なオブザベーションに対しては、自動変数_ERROR_の値は1に設定されません。

参照項目 無効なデータの処理方法

詳細

INPUTを使用する必要がある場合

外部ファイルやインストリームデータから生データを読み込むには、INPUTステートメントを使用します。データが外部ファイルに保存されている場合、INFILEステートメントにそのファイルを指定できます。INFILEステートメントは、データレコードを読み込むINPUTステートメントよりも前に実行する必要があります。読み込むデータがインストリームデータの場合、ジョブストリーム内のDATALINESステートメントに続けてデータ行を指定する必要があります。読み込むデータにセミコロンが含まれる場合、DATALINES4ステートメントに続けてデータ行を指定します。生データを読み込む1つのDATAステップには、複数のINPUTステートメントを使用できます。
INPUTステートメントの前にINFILEステートメントのfile-specificationにDATALINESを指定すると、INFILEステートメントを使用してインストリームデータを読み込むこともできます。INFILEステートメントにDATALINESを指定すると、INFILEステートメントのほとんどのオプションをインストリームデータの読み込みに使用できます。
SASデータセットに格納されているデータを読み込むには、SETステートメントを使用します。SAS以外のソフトウェアで作成されたデータベースまたはPCファイル形式のデータを読み込むには、LIBNAMEステートメントでデータにアクセスした後に、SETステートメントを使用します。詳細については、SAS/ACCESSのドキュメントを参照してください。
z/OS固有: z/OSで生成され、PROC PRINTTOでキャプチャされたログファイルには、列1にASAコントロール文字が含まれています。INPUTステートメントにカラム入力またはカラムポインタコントロールを使用して、z/OSで生成されたログファイルを読み込む場合、この文字を考慮する必要があります。

入力スタイル

入力スタイルの概要

INPUTステートメントでレコードの値を指定する方法は4つあります。
  • カラム
  • リスト(単純および修飾)
  • フォーマット
  • 名前付き
各変数の値は、次のいずれかの入力スタイルを使用して読み込まれます。INPUTステートメントには、入力レコードでのデータ値の配置に応じて、使用可能な入力スタイルのいずれかまたはすべてを指定することができます。ただし、名前付き入力がINPUTステートメントに使用されると、他の入力スタイルを使用することはできません。

カラム入力

カラム入力を使用する場合、INPUTステートメントで、値の位置を示す列番号を変数名の後ろに指定します。番号は、入力データレコード内で変数の値が存在する位置を示しています。
input name $ 1-8 age 11-12;
このINPUTステートメントを実行すると、次のデータレコードを読み込むことができます。
----+----1----+----2----+
Peterson  21
Morgan    17
NAMEは文字変数なので、変数名と列番号の間に$を指定しています。詳細については、 INPUTステートメント、カラムを参照してください。

リスト入力

リスト入力では、変数名をINPUTステートメント内に単にリストします。文字変数名の後ろには$を指定します。
input name $ age;
このINPUTステートメントを実行すると、ブランクで区切られているデータ値、または列位置が揃っているデータ値を読み込むことができます。ただし、それぞれの値の間には1つ以上のブランクが必要です。
----+----1----+----2----+
Peterson  21
Morgan  17
詳細については、 INPUTステートメント、リストを参照してください。

フォーマット入力

フォーマット入力では、INPUTステートメントで変数名の後に入力形式を指定します。入力形式では、データの種類や入力値のフィールド長を指示します。入力形式を指定すると、パック10進などの非標準形式のデータや、カンマなどの特殊文字を含む数値を読み込むこともできます。
input name $char8. +2 income comma6.;
このINPUTステートメントを実行すると、次のデータレコードが正しく読み込まれます。
----+----1----+----2----+
Peterson  21,000
Morgan    17,132
ポインタコントロールを+2と指定し、入力ポインタを変数INCOMEの値が含まれるフィールドに移動させています。詳細については、 INPUTステートメント、フォーマットを参照してください。

名前付き入力

名前付き入力では、変数名の後に等号(=)を指定します。入力レコードから変数名と等号が検索されます。
input name= $ age=;
このINPUTステートメントを実行すると、次のデータレコードが正しく読み込まれます。
----+----1----+----2----+
name=Peterson age=21
name=Morgan age=17
詳細については、 INPUTステートメント、名前付きを参照してください。

1つのINPUTステートメントに複数のスタイルを指定する

1つのINPUTステートメントに異なる入力スタイルのいずれか、またはすべてを指定できます。
input idno name $18. team $ 25-30 startwght endwght;
このINPUTステートメントを実行すると、次のデータレコードが正しく読み込まれます。
----+----1----+----2----+----3----+----
023 David Shaw         red    189 165
049 Amelia Serrano     yellow 189 165
変数IDNO、STARTWGHT、ENDWGHTの値はリスト入力で、変数NAMEの値はフォーマット入力で読み込まれます。また、変数TEAMの値はカラム入力で読み込まれます。
注: INPUTステートメントに名前付き入力が使用されると、入力スタイルを変更することはできません。

ポインタコントロール

ポインタの概要

入力データレコードから入力バッファに値を読み込む場合、ポインタを使用して読み込み位置を制御します。INPUTステートメントには、ポインタの動きを制御する3つの方法があります。
カラムポインタコントロール
データレコードのデータ値を読み込むときに、ポインタの列位置をリセットします。
行ポインタコントロール
データレコードのデータ値を読み込むときに、ポインタの行位置をリセットします。
ラインホールド指定子
読み込んだ入力レコードが入力バッファに保持されるので、他のINPUTステートメントでも保持した値を使用できます。デフォルトでは、INPUTステートメントを実行すると、前回読み込んだレコードを解放してから、次のレコードを読み込みます。
カラムポインタコントロールや行ポインタコントロールを使用すると、ポインタを移動させる行または列の絶対位置を指定したり、現在のポインタの位置の相対位置として移動先の列または行を指定できます。INPUTステートメントで指定できるすべてのポインタコントロールを次の表に示します。
INPUTステートメントで指定できるポインタコントロール
ポインタコントロール
相対指定
絶対指定
カラムポインタコントロール
+n
@n
+numeric-variable
@numeric-variable
+(expression)
@(expression)
@'character-string'
@character-variable
@(character-expression)
行ポインタコントロール
/
#n
#numeric-variable
#(expression)
ラインホールド指定子
@
(なし)
@@
(なし)
注: ポインタコントロールは、常に適用する変数の前に指定するようにしてください。
INFILEステートメントにCOLUMN=オプションやLINE=オプションを指定して、ポインタの現在の列位置や行の位置を確認することができます。

カラムポインタコントロールと行ポインタコントロールの使用

カラムポインタコントロールでは、入力値の読み込みを開始する列を指定します。
次の入力レコードに移動したり、オブザベーションごとの入力レコード数を定義するには、INPUTステートメントで行ポインタコントロールを使用します。行ポインタコントロールには、読み込み対象とする入力レコードを指定します。複数のデータレコードを入力バッファに読み込むには、INFILEステートメントのN=オプションに読み込むレコード数を指定します。N=オプションの指定を省略する場合は、特別な注意が必要になります。詳細については、 1つのオブザベーションにつき複数のレコードを読み込むを参照してください。

ラインホールド指定子の使用

ラインホールド指定子を使用すると、次の場合にポインタを現在の入力レコードに保持します。
  • 複数のINPUTステートメントで同じデータレコードを読み込む場合(後置@)
  • 1つの入力行に複数のオブザベーションの値が含まれる場合(後置@@)
  • DATAステップの次の反復でレコードをもう一度読み込む必要がある場合(後置@@)
後置@を使用すると、次のINPUTステートメントで同じレコードを読み込むことができます。後置@@を使用すると、DATAステップの反復間を通して、読み込んだレコードを保持して次のINPUTステートメントで使用することができます。
通常、DATAステップでINPUTステートメントを実行するたびに、新しいデータレコードが入力バッファに読み込まれます。後置@を使用する場合は、次のようになります。
  • ポインタの位置は変化しません。
  • 入力バッファに新しいレコードは読み込まれません。
  • DATAステップの同じ反復内で次のINPUTステートメントを実行すると、新しいレコードではなく同じレコードが読み込まれます。
後置@で保持したレコードは、次の場合に解放されます。
  • ヌルINPUTステートメントを実行した場合
    input;
  • 後置@を指定せずにINPUTステートメントを実行した場合
  • DATAステップの次の反復を開始した場合
通常、後置@@を使用すると、DATAステップの次の反復でもINPUTステートメントは同じレコードを読み込みます。後置@@で保持したレコードは、次の場合に解放されます。
  • ポインタが入力レコードの行端を超えた場合
  • ヌルINPUTステートメントを実行した場合
    input;
  • DATAステップの次の反復が開始され、このDATAステップで後置@を指定したINPUTステートメントが実行された場合
    input @;

値を読み込んだ後のポインタの位置

1つのINPUTステートメントに複数の入力スタイルを組み合わせて使用する場合は、値を読み込んだ後の入力ポインタの位置を理解しておくことが重要になります。カラム入力とフォーマット入力を使用すると、ポインタはINPUTステートメントに指定された列を読み込んだあと、次の列で停止します。リスト入力を使用すると、ポインタはデータレコードを走査してデータ値を探してから、値の終わりを示すブランクを読み込みます。そのため、リスト入力で値を読み込んだ後、ポインタは値の終わりから2番目の列で停止します。
たとえば、リスト入力、カラム入力、フォーマット入力を使用して次のデータレコードを読み込むことができます。
----+----1----+----2----+----3
REGION1    49670
REGION2    97540
REGION3    86342
次のINPUTステートメントでは、リスト入力を使用してデータレコードを読み込みます。
input region $ jansales;
REGIONの値を読み込んだ後、ポインタは列9で停止します。
----+----1----+----2----+----3
REGION1    49670
        ↑
次のINPUTステートメントでは、カラム入力とフォーマット入力を使用してデータレコードを読み込みます。
  • カラム入力
    input region $ 1-7 jansales 12-16;
  • フォーマット入力
    input region $7. +4 jansales 5.;
    input region $7. @12 jansales 5.;
変数REGIONの値を読み込むため、このINPUTステートメントでは、7列読み込んでから列8で停止するようにポインタに指示します。
----+----1----+----2----+----3
REGION1    49670
       ↑

1つのオブザベーションにつき複数のレコードを読み込む

#ポインタコントロールを使用する

INPUTステートメントの#ポインタコントロールの後ろに指定した最大値によって、入力バッファに読み込む入力データレコード数が決まります。INFILEステートメントにN=オプションを指定すると、このレコード数を変更することができます。たとえば、次のステートメントでは、#ポインタコントロールに指定した最大値は3になります。
input @31 age 3. #3 id 3-4 #2 @6 name $20.;
関連するINFILEステートメントにN=オプションを指定していない場合、DATAステップを実行するたびに、INPUTステートメントは3つの入力レコードを読み込みます。
各オブザベーションに複数の入力レコードが存在しても、最後のレコードの値は読み込まない場合、INPUTステートメントに#ポインタコントロールを使用するか、INFILEステートメントにN=オプションを使用して最後に読み込む入力レコードを指定する必要があります。たとえば、各オブザベーションに4つのレコードが存在しても、最初の2つの入力レコードの値しか読み込まない場合、次のINPUTステートメントを使用します。
input name $ 1-10 #2 age 13-14 #4;
/ポインタコントロールを指定してポインタを次のレコードに移動した場合、INPUTステートメントに#ポインタコントロールを指定するか、INFILEステートメントにN=オプションを指定して、入力バッファに読み込むレコード数を設定します。ポインタを前のレコードに戻すには、#ポインタコントロールを使用します。たとえば、次のステートメントでは、INFILEステートメントにN=オプションを指定していない場合、#2ポインタコントロールを指定してレコードを2つ読み込むように指示する必要があります。
input a / b #1 @52 c #2;
このINPUTステートメントでは、変数Aに最初のレコードの値を割り当てます。ポインタを次の入力レコードに移動してから、変数Bに値を割り当てます。次に、ポインタを2番目のレコードから最初のレコードの列1に復帰した後に、列52に移動して変数Cに値を割り当てます。ポインタコントロールの#2は、オブザベーションの入力レコードが2行にわたることを示すため、Cの値を読み込むためにポインタが最初のレコードに復帰できます。
オブザベーションごとに入力レコード数が異なる場合、INFILEステートメントのN=オプションにオブザベーションのレコード数の最大値を指定します。詳細については、 N=オプションを参照してください。

行の終わりを超えて読み込む

ポインタコントロールの@または+に指定した値が、現在のレコードの終端または終端を超えた位置に移動し、その列から次の値を読み込むように指示している場合、ポインタは、次のレコードの列1に移動してから値を読み込みます。次のメッセージがSASログに書き込まれます。
NOTE: SAS went to a new line when INPUT statement
      reached past the end of a line.
INFILEステートメントでデフォルトの動作(FLOWOVERオプション)を変更することができます。
INFILEステートメントにSTOPOVERオプションを指定すると、この状態をエラーと判断し、データセットの作成を終了します。
INFILEステートメントにMISSOVERオプションを指定すると、ポインタがレコードの終端に到達した場合、INPUTステートメントでまだ値が読み込まれていない変数には欠損値を割り当てます。
INFILEステートメントにTRUNCOVERオプションを指定すると、INPUTステートメントで読み込んだ最後の変数に可変長データが含まれている場合、カラム入力またはフォーマット入力を使用します。

レコードの前にポインタを移動する

カラムポインタコントロールをレコードの開始位置よりも前に移動するように指示した場合、ポインタは列1に移動します。たとえば、次のINPUTステートメントでは、最初の値を読み込んだ後、ポインタを列-2に移動するように指示しています。
data test;
   input a @(a-3) b;
   datalines;
 2
;
そのため、変数Aの値を読み込んだ後、ポインタは列1に移動します。変数AとBには同じ値が割り当てられます。

無効なデータの処理方法

指定した変数の入力値に無効な文字が検出された場合、次の処理を実行します。
  • 読み込み中の変数の値を欠損値に設定するか、INVALIDDATA=システムオプションに指定した値に設定します。詳細については、 XisError: No pubcode in link data found for lesysoptsrefを参照してください。
  • 無効なデータに関するメッセージがSASログに出力されます。
  • 無効な値が含まれる入力行と列番号をSASログに出力します。表示不能な文字は、16進表記で表示されます。カラム番号を見やすくするために、入力行の上部に罫線が出力されます。
  • 現在のオブザベーションの自動変数_ERROR_の値が1に設定されます。
エラーレポートのフォーマット修飾子を指定すると、SASログに出力される情報の量を制御することができます。?および?? 修飾子を指定すると、無効なデータを示すメッセージを出力しないようにします。ただし、?? 修飾子では、自動変数_ERROR_の値が0に設定されます。たとえば、次の2つのステートメントは同じ結果になります。
  • input x ?? 10-12;
  • input x ? 10-12; 
    _error_=0;
どちらの場合でも、変数Xの値が無効な場合は欠損値に設定されます。無効なデータが発生する原因については、 SAS言語リファレンス: 解説編を参照してください。

ファイルの終端

INPUTステートメントがデータを最後まで読み込むと、ファイルの終端が検出されます。DATAステップでファイルの終端に到達した後も他のレコードを読み込もうとすると、DATAステップの実行が終了します。DATAステップの実行を継続するには、INFILEステートメントにEND=オプションまたはEOF=オプションを使用します。その場合、ファイルの終端の検出時に、INPUTステートメントの実行を停止してもDATAステップの処理は継続するプログラムステートメントを作成することができます。詳細については、 INFILEステートメントを参照してください。

配列

INPUTステートメントでは、配列参照を使用して入力データ値を読み込むことができます。配列参照を丸かっこで囲むと、ポインタコントロールに配列参照を使用できます。文字変数でポインタの位置を指定するを参照してください。
配列のsubscriptにアスタリスク(*)を使用すると、明示的に定義済みの配列のすべての要素を読み込むことができます。1次元配列または多次元配列を使用できます。subscriptは中かっこ、大かっこ、丸かっこで囲んでください。このステートメントの形式は次のようになります。
INPUT array-name{*};
リスト入力、カラム入力、フォーマット入力で配列を使用できます。ただし、_TEMPORARY_で定義されている配列や、subscriptにアスタリスクを使用する配列に値を読み込むことはできません。たとえば、次のステートメントでは変数X1からX100を作成し、入力形式2.を使用してデータ値を変数に割り当てます。
array x{100};
input x{*} 2.;

比較

  • INPUTステートメントでは、外部ファイルの生データ、またはDATALINEステートメントの後ろに指定されているインストリームのデータ行を読み込みます。これらは、SASへの記述が必要です。SETステートメントでは、SASデータセットを読み込みます。このデータセットには、データ値の記述情報が含まれています。
  • INPUTステートメントはデータを読み込みます。PUTステートメントはデータ値、テキスト文字列、またはその両方をSASログまたは外部ファイルに書き込みます。
  • INPUTステートメントは外部ファイルからデータを読み込みます。INFILEステートメントはINPUTステートメントで読み込むファイルや、ファイルを読み込む方法を制御するオプションを指定します。

例1: INPUTステートメントで複数のスタイルを使用する

この例では、1つのINPUTステートメントで複数の入力スタイルを使用します。
data club1;
   input Idno Name $18.
      Team $ 25-30 Startwght Endwght;
   datalines;
023 David Shaw         red    189 165
049 Amelia Serrano     yellow 189 165
... more data lines ...
;
次の表に入力スタイルの種類を示します。
変数
入力の種類
Idno、Startwght、Endwght
リスト入力
Name
フォーマット入力
Team
カラム入力

例2: ヌルINPUTステートメントを使用する

この例では、引数を指定しないINPUTステートメントを使用します。このDATAステップを実行すると、SAS変数を作成せずに、入力ファイルから出力ファイルにレコードがコピーされます。
data _null_;
   infile file-specification-1;
   file file-specification-2;
   input;
   put _infile_;
run;

例3: 入力バッファ内のレコードを保持する

この例では、2種類の入力データレコードを含むファイルを読み込み、読み込んだレコードからSASデータセットを作成します。1つのデータレコードには、ある大学のコースに関する情報が保存されています。もう1つのデータレコードには、コースを専攻した学生の情報が保存されています。2つのレコードを読み込み、出力形式が異なる複数の変数に値を割り当てるには、2つのINPUTステートメントを使用する必要があります。次に示すように、クラス情報を含むレコードの列1にはCという値が格納されています。また、学生情報を含むレコードの列1にはSという値が格納されています。
----+----1----+----2----+
C HIST101 Watson
S Williams 0459
S Flores   5423
C MATH202 Sen
S Lee      7085
どちらのINPUTステートメントを使用するかを判断するため、このレコードの値を読み込むときに確認します。レコードに含まれる情報がクラスの情報か学生の情報かを判断する変数のみを読み込むINPUTステートメントを使用します。
data schedule(drop=type);
   retain Course Professor;
   input type $1. @;
   if type='C' then 
      input course $ professor $;
   else if type='S' then 
      do;
        input Name $10. Id;
        output schedule;
      end;
datalines;
C HIST101 Watson
S Williams 0459
S Flores   5423
C MATH202 Sen
S Lee      7085 
;
run;

proc print; 
run;
最初のINPUTステートメントは、各行の列1から変数TYPEの値を読み込みます。INPUTステートメントの末尾に後置@が指定されているので、DATAステップの次のINPUTステートメントでも同じ行を読み込みます。最初のINPUTステートメントの後に記述されているIF-THENステートメントは、次のINPUTステートメントで行の残りを読み込む前に、レコードに含まれる情報がクラスの情報か学生の情報かを判断します。後置@を指定されていないこのINPUTステートメントは、現在保持している行を解放します。RETAINステートメントでは、大学のコースの値が保持されます。このDATAステップは、学生情報のレコードを読み込んだ後、オブザベーションをSCHEDULEデータセットに書き込みます。
生成されたデータセットSCHEDULEの内容をPROC PRINTで出力した結果を次に示します。
データセットSCHEDULE
データセットSCHEDULE

例4: DATAステップの反復間を通してレコードを保持する

この例は、1つの入力データレコードから複数のオブザベーションを作成する方法を示しています。各レコードには、変数NAMEと変数AGEの値が複数含まれています。このDATAステップでは、変数NAMEの値と変数AGEの値をそれぞれ1つ読み込んでからオブザベーションを1つ出力します。レコード内のすべての入力値が処理されるまで、NAMEとAGEの値の組み合わせを継続して読み込みます。
data test;
   input name $ age @@;
   datalines;
John 13 Monica 12 Sue 15 Stephen 10
Marc 22 Lily 17
;
このINPUTステートメントでは後置@@が指定されているので、DATAステップの反復間で入力ポインタが制御されます。生成されるSASデータセットには、6つのオブザベーションが含まれます。

例5: 数値変数でポインタの位置を指定する

この例では、数値変数を使用してポインタの位置を指定します。生データファイルには、多国籍企業の複数の事業所別の従業員数が保存されています。入力データレコードは次のとおりです。
----+----1----+----2----+----3----+
8      New York    1 USA 14
5   Cary           1 USA 2274
3 Chicago          1 USA 37
22 Tokyo           5 ASIA 80
5   Vancouver      2 CANADA 6
9       Milano     4 EUROPE 123
最初の列は、事業所の所在地名の開始列位置を含みます。次の数値列は、地域カテゴリを示しています。また、各事業所の従業員数の前に地域名が示されています。
@numeric-variableポインタコントロールと後置@を組み合わせて使用し、事業所の所在地名の開始列位置を指定します。レコードを読み込みには、INPUTステートメントを2つ使用します。最初のINPUTステートメントでは、@ numeric-variableポインタコントロールの値を取得します。2番目のINPUTステートメントでは取得した値を使用して、ポインタの移動先となる列を指示します。
data office (drop=x);
   infile file-specification; 
   input x @;
   if 1<=x<=10 then
      input @x City $9.;
   else do;
      put 'Invalid input at line ' _n_;
      delete;
   end;
run;
このDATAステップでは、OFFICEデータセットに5つのオブザベーションのみが書き込まれます。4番目の入力データレコードは、変数Xの値が10を超えているので無効になります。そのため、2番目のINPUTステートメントは実行されません。そのかわり、PUTステートメントによってメッセージがSASログに書き込まれます。また、DELETEステートメントによってオブザベーションの処理が中止されます。

例6: 文字変数でポインタの位置を指定する

この例では、文字変数を使用してポインタの位置を指定します。数値変数でポインタの位置を指定するで作成されたOFFICEデータセットには、文字変数CITYが含まれています。この変数の値は、事業所の所在地を示しています。ここで、生データファイルから、他の値を読み込む必要が発生したと仮定します。もう1つDATAステップを追加することで、その値を検出するために、@character-variableポインタコントロール、後置@、@character-expressionポインタコントロールを組み合わせられます。
OFFICEデータセットに含まれるオブザベーションが元の入力データレコードと同じ順で格納されている場合、次のDATAステップを使用することができます。
data office2;
   set office;
   infile file-specification;
   array region {5} $ _temporary_
         ('USA' 'CANADA' 'SA' 'EUROPE' 'ASIA');
   input @city Location : 2. @;
   input @(trim(region{location})) Population : 4.;
run;
ARRAYステートメントは、一時配列要素に初期値を割り当てます。この要素は、事業所の所在地の地域に対応しています。最初のINPUTステートメントには、@character-variableポインタコントロールが指定されています。各レコードから変数CITYの値を示す文字列を走査します。次に、LOCATIONの値を変数CITYの次にある非ブランク列から読み込みます。LOCATIONは、事業所の地域を示す数値になります。2番目のINPUTステートメントでは、@character-expressionポインタコントロールに配列参照を使用して、入力レコード内の変数POPULATIONの位置を指示します。また、この式では、TRIM関数を使用して、文字値の末尾にあるブランクを取り除きます。このようにして、入力データの文字列と配列要素の値の完全一致を検出します。
生成されたデータセットOFFICE2の内容をPROC PRINTで出力した結果を次に示します。
データセットOFFICE2
データセットOFFICE2

例7: ポインタを後方(左)に移動する

この例では、ポインタを戻すいくつかの方法を示します。
  • 次のINPUTステートメントでは、@ポインタコントロールを使用して列26から始まる変数BOOKの値を読み込みます。次に、ポインタを同じ行の列1に戻し、変数COMPANYの値を読み込みます。
    input @26 book $ @1 company;
  • 次のINPUTステートメントでは、+numeric-variableまたは+(expression)を使用し、ポインタを1列戻します。次の2つのステートメントは同じ結果になります。
    • m=-1;
      input x 1-10 +m y 2.;
    • input x 1-10 +(-1) y 2.;

関連項目:

前のページ|次のページ|ページの先頭へ