前のページ|次のページ

INPUTステートメント、フォーマット

指定した形式で入力値を読み込み、読み込んだ値を対応するSAS変数に割り当てます。

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

構文

引数

pointer-control

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

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

variable

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

要件 (variable-list)の後ろに(informat-list)を指定します。
フォーマット入力でポインタコントロールを使用する

(variable-list)

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

参照項目 変数と入力形式をグループ化する方法
入力形式リストを使用する

informat.

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

ヒント 実際の入力値に含まれる小数点は、数値入力形式による小数点の指定より優先されます。
参照項目 SAS出力形式と入力形式: リファレンスのSAS入力形式
フォーマット入力でポインタコントロールを使用する

(informat-list)

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

INPUTステートメントでは、(informat-list)に次を指定できます。

informat.

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

pointer-control

値の読み込み位置を指示するポインタコントロール(@、#、/、+)を1つ指定します。

n*

入力形式リストでn*に続けて指定した入力形式をn回繰り返します。

次のステートメントでは、7.2入力形式を使用してGRADES1、GRADES2、GRADES3を読み込み、5.2入力形式を使用してGRADES4、GRADES5を読み込みます。
input (grades1-grades5)(3*7.2, 2*5.2);
制限事項 (informat-list)は(variable-list)の後ろに指定する必要があります。
参照項目 変数と入力形式をグループ化する方法
入力形式リストを使用する

@

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

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

@@

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

制限事項 後置@@は、INPUTステートメントの最後の項目として指定する必要があります。
ヒント 後置@@は、入力行に複数のオブザベーションの値が含まれる場合に便利です。
参照項目 ラインホールド指定子の使用

詳細

フォーマット入力の使用が求められる場合

フォーマット入力を使用する場合、変数名の後ろに入力形式を指定することにより、変数の値を読み込む方法を定義します。入力形式では、データの種類や入力値のフィールド長を指示します。入力形式を指定すると、パック10進などの非標準形式のデータや、カンマなどの特殊文字を含む数値を読み込むこともできます。 (脚注 1) SAS入力形式の説明については、 XisError: No pubcode in link data found for leforinforrefを参照してください。
通常のフォーマット入力を使用する場合、対応する値が入力データに表示されるのと同じ順序で変数を指定する必要があります。ポインタコントロールを使用すると、変数を任意の順序で読み込むことができます。詳細については、INPUTステートメントを参照してください。

欠損値

通常、フォーマット入力では、数値の欠損値は1つのピリオドで示されます。また、文字の欠損値は1つのブランクで示されます。フォーマット入力でブランクがどのように解釈されるかは、使用する入力形式によって異なります。たとえば、$CHAR.wと指定すると、ブランクは値の一部として読み込まれます。ただし、BZ.wと指定すると、ブランクは0に変換されます。

可変長レコードの読み込み

デフォルトでは、可変長データレコードの読み込みには、FLOWOVERオプションを使用します。レコードに含まれる値の数が必要な数よりも少ない場合、INPUTステートメントは次のデータレコードから値を読み込みます。可変長データを読み込むには、INFILEステートメントにTRUNCOVERオプションを指定することをお勧めします。詳細については、行の終わりを超えて読み込むを参照してください。

変数と入力形式をグループ化する方法

読み込む値があるパターンで配置されている場合、入力形式リストをグループ化することができます。グループ化した入力形式リストは、次の2つのリストで構成されます。
  • 読み込み対象の変数名を丸かっこで囲んで指定したリスト
  • ブランク区切りまたはカンマ区切りの対応する入力形式を丸かっこで囲んで指定したリスト
入力形式リストを使用するとINPUTステートメントを簡潔に記述できます。これは、入力形式リストはすべての変数が読み込まれるまで繰り返し適用され、簡略化された番号付きの変数名が使用されるためです。入力形式リストを使用すると、個々の変数を指定する必要がなくなります。
たとえば、SCORE1からSCORE5までの5つの変数の値が、ブランクで区切らずに、値ごとに4つの列幅で保存されている場合、次のINPUTステートメントを使用して値を読み込みます。
input (score1-score5) (4. 4. 4. 4. 4.);
ただし、変数の数が指定した入力形式の数よりも多い場合、INPUTステートメントは残りの変数の読み込み時に入力形式リストを再利用します。前述のステートメントを次のように簡略化できます。
input (score1-score5) (4.);
INPUTステートメントには必要な数だけ入力形式リストを使用できますが、入力形式リストはネストさせないでください。変数リストにあるすべての値が読み込まれると、INPUTステートメントは入力形式リストに残っている指示を無視します。この例については、 必要な数以上の入力形式が指定されている場合を参照してください。
入力形式リストにn* 修飾子を使用すると、後ろに指定した入力形式をn回繰り返します。次に例を示します。
input (name score1-score5) ($10. 5*4.);

入力形式の保存方法

INPUTに指定した入力形式は、SASデータセットに保存されません。INFORMATステートメントやATTRIBステートメントに指定した入力形式は恒久的に保存されます。そのため、後続のDATAステップでは、恒久的に保存された入力形式を使用してデータ値を読み込むことができます。入力形式を指定したり、PROC FSEDITを使用して正しい形式でデータを入力する必要はありません。

比較

フォーマット入力で変数を読み込むときのポインタの動きは、カラム入力のポインタの動きと似ています。ポインタは入力形式に指定された長さを移動した後、次の列で停止します。列位置が揃っていないデータを入力形式を使用して読み込むには、修飾リスト入力を使用します。修飾リスト入力を使用すると、リスト入力の走査機能を使用できます。 リスト入力の使用が求められる場合を参照してください。

例1: フォーマット入力でポインタコントロールを使用する

次のINPUTステートメントでは、入力形式とポインタコントロールを使用します。
data sales;
   infile file-specification;
   input item $10. +5 jan comma5. +5 feb comma5. 
      +5 mar comma5.;
run;
このステートメントでは、次の入力データレコードが読み込まれます。
----+----1----+----2----+----3----+----4
trucks         1,382     2,789     3,556
vans           1,265     2,543     3,987
sedans         2,391     3,011     3,658
ITEMの値は、レコードの最初の10列から読み込まれます。ポインタは11列の位置で停止します。末尾にあるブランクを取り除いてから、ITEMの値がプログラムデータべクトルに書き込まれます。次に、ポインタを5列右に移動してから、INPUTステートメントでCOMMA5.入力形式を使用してJANの値を読み込みます。この入力形式は、カンマを含む数値の読み込みを実行し、フィールド長として5列使用します。その後も、ポインタを5列ずつ右に移動してから、INPUTステートメントでCOMMA5.入力形式を使用してFEBとMARの値を読み込みます。

例2: 入力形式リストを使用する

次のINPUTステートメントでは、文字入力形式$10.で変数NAMEの値を読み込みます。また、数値入力形式4.でSCORE1からSCORE5までの変数の値を読み込みます。
data scores;
   input (name score1-score5) ($10. 5*4.);
   datalines;
Whittaker 121 114 137 156 142
Smythe    111 97  122 143 127
;

例3: 必要な数以上の入力形式が指定されている場合

次の入力形式リストには、INPUTステートメント実行時に必要となる数よりも多い入力形式が指定されています。
data test;
   input (x y z) (2.,+1);
   datalines;
2 24 36
0 20 30
   ;
このINPUTステートメントでは、入力形式2.を使用してXの値を読み込みます。カラムポインタコントロールは+1と指定されているため、ポインタを1列だけ前方(右)に移動します。次に、入力形式2.を使用してYの値を読み込みます。カラムポインタコントロールは+1と指定されているため、再度ポインタを1列だけ前方(右)に移動します。最後に、入力形式2.を使用してZの値を読み込みます。3回目の繰り返しでは、INPUTステートメントはポインタコントロールの移動を指示する+1を無視します。

関連項目:

脚注 1:標準のデータ値や非標準のデータ値の情報については、 SAS言語リファレンス: 解説編を参照してください。[戻る]
前のページ|次のページ|ページの先頭へ