前のページ|次のページ

INPUTステートメント、リスト

入力データレコードの入力値を走査し、対応するSAS変数に割り当てます。

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

構文

INPUT <pointer-control> variable <$> <&> <@ | @@>;
INPUT <pointer-control> variable <: | & | ~>
<informat.><@ | @@>;

引数

pointer-control

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

参照項目 カラムポインタコントロール および行ポインタコントロール
ブランクが埋め込まれた文字データの読み込み

variable

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

$

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

ヒント この変数が文字変数と事前に定義されている場合、$を指定する必要はありません。
単純リスト入力を使用した位置が揃っていないデータの読み込み

&

文字値に1つ以上のブランクが含まれている場合に指定します。このフォーマット修飾子を指定すると、次の非ブランク列から値を、連続する2つのブランク、変数に定義された長さ、入力行の最後のいずれかにポインタが到達するまで読み込みます。

制限事項 & 修飾子は適用対象となる変数名と$記号の後ろに指定する必要があります。
ヒント & 修飾子の後ろに入力形式を指定しても、連続する2つのブランクというフォーマット修飾子の終了条件は変わりません。
参照項目 修飾リスト入力
ブランクが埋め込まれた文字データの読み込み

で定義された値は保持されません。

INPUTステートメントで変数の値の読み込みに使用する入力形式を指定できます。文字変数の場合、このフォーマット修飾子を指定すると、次の非ブランクの列から値を、次のブランクの列、長さを指定した変数、データ行の最後のいずれかにポインタが到達するまで読み込みます。数値変数の場合、このフォーマット修飾子を指定すると、次の非ブランク列の列から値を、次のブランクの列、データ行の最後のいずれかにポインタが到達するまで読み込みます。

ヒント 変数の長さが定義されていない場合、入力形式の長さに従って値を読み込んでから格納されます。
ポインタは、次のブランク列に到達するまで読み込みを継続します。ただし、フィールドの長さが入力形式の長さよりも長い場合、入力形式の長さまで切り捨てられます。
参照項目 修飾リスト入力
入力形式を使用した位置が揃っていないデータの読み込み

修飾リスト入力を使用した区切られたデータの読み込み

~

一重引用符、二重引用符、区切り文字を特別な方法で扱うように指示します。このフォーマット修飾子を指定すると、区切り文字ではなく文字として、引用符で囲まれた文字値内の区切り文字を読み込みます。また、変数に値を書き込む際、この引用符を保持します。

制限事項 INFILEステートメントにDSDオプションを使用する必要があります。使用しない場合、INPUTステートメントはこのオプションは無視します。
参照項目 修飾リスト入力
修飾リスト入力を使用した区切られたデータの読み込み

informat.

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

ヒント 実際の入力値に含まれる小数点は、数値入力形式による小数点の指定より優先されます。
参照項目 SAS出力形式と入力形式: リファレンスのSAS入力形式
入力形式を使用した位置が揃っていないデータの読み込み

修飾リスト入力を使用した区切られたデータの読み込み

@

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

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

@@

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

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

詳細

リスト入力の使用が求められる場合

リスト入力を使用する場合、入力データレコードでのフィールドの表示順と同じ順序で、INPUTステートメントに変数名を指定する必要があります。SASではデータ行を走査して次の値を検出しますが、値を区切るブランクは無視されます。リスト入力では、データが特定の列位置に存在していなくてもかまいません。ただし、区切り文字を変更しないかぎり、値と値の間は1つ以上のブランクで区切る必要があります。デフォルトでは、データ値の区切り文字は1つのブランク、または入力レコードの最後に設定されています。リスト入力ではあるデータをスキップして後続のデータを読み込むことはできませんが、データレコード内の指定した位置より後ろにあるすべてのデータを無視することができます。ただし、ポインタコントロールを使用すると、データ値を読み込む順序を変更することができます。
リスト入力には、次の2種類あります。
  • 単純リスト入力
  • 修飾リスト入力
フォーマット修飾子を使用すると単純リスト入力の複数の制限を取り除くことができるため、修飾リスト入力によりINPUTステートメントを幅広い用途に使用できるようになります。 この出力の内容については修飾リスト入力 を参照してください。

単純リスト入力

単純リスト入力では、INPUTステートメントで読み込めるデータの種類に複数の制限があります。
  • デフォルトでは、入力値は1つ以上のブランクで区切る必要があります。ブランク以外の区切り文字を使用する場合は、INFILEステートメントにDLM=オプション、DLMSTR=オプション、DSDオプションのいずれかを使用します。
  • 欠損値は、ブランクや連続する2つの区切り文字ではなく、ピリオドで表示します。
  • 文字入力値には8バイトを超えた値を使用できません。ただし、あらかじめLENGTH、ATTRIB、INFORMATの各ステートメントでそれ以上の変数の長さ指定している場合を除きます。
  • 区切り文字を変更しない場合、文字値にブランクを使用することはできません。
  • 標準の数値形式または文字形式のデータでなければなりません。 (脚注 1)

修飾リスト入力

フォーマット修飾子を使用すると、リスト入力を幅広い用途に使用できるようになります。フォーマット修飾子を次に示します。
フォーマット修飾子
用途
&
ブランクを含む文字値を読み込みます。
:
入力形式による追加指示が必要ですが、列位置が不揃いのデータ値を読み込みます。1
~
引用符で囲んだ文字値内の区切り文字を通常の文字として読み込みます。また、引用符は保持されます。
1フォーマット入力とポインタコントロールを使用して、列位置が揃っているデータ値を読み込みます。
たとえば、:(コロン)修飾子と入力形式を併用すると、8バイトを超える文字値や非標準の値を含む数値を読み込むことができます。
リスト入力ではブランクが区切り文字として解釈されるので、ブランクを含む値を読み込むには、修飾リスト入力を使用します。&修飾子を使用すると、連続していないブランクを含む文字値を読み込みます。ただし、データ値は2つ以上のブランクで区切られている必要があります。リスト入力を使用して先頭、末尾、内部のどこかにブランクを含むデータを読み込むには、INFILEステートメントにDLM=オプションまたはDLMSTR=オプションを使用して他の文字を区切り文字に指定します。修飾リスト入力を使用した区切られたデータの読み込みを参照してください。区切り文字がブランクで、先頭、末尾、内部のどこかにブランクを含む入力データには、カラム入力またはフォーマット入力のいずれかを使用することをお勧めします。引用符で区切値が囲まれている場合、INFILEステートメントにDSDオプションを指定すると、リスト入力を使用できます。

比較

修飾リスト入力とフォーマット入力の違い
修飾リスト入力には走査機能があるため、入力形式を使用して、列位置が不揃いのデータを読み込めます。フォーマット入力では、カラム入力と同じようにポインタを移動させて変数の値を読み込みます。ポインタは入力形式に指定された長さを移動した後、次の列で停止します。
次のDATAステップでは、修飾リスト入力で最初のデータを読み込み、フォーマット入力をで2番目のデータを読み込みます。
data jansales;
   input item : $10. amount comma5.;
datalines;
trucks 1,382
vans 1,235
sedans 2,391
;
ITEMは修飾リスト入力で読み込まれます。INPUTステートメントは、ポインタがブランクに到達した時点で読み込みを停止します。ポインタは、このフィールドの末尾から2列先(右)に移動します。この位置からフォーマット入力でAMOUTの値を読み込みます。
一方、フォーマット入力は、フィールドの総幅を読み込むまで読み込みを継続します。次のINPUTステートメントでは、フォーマット入力を使用して両方のデータ値を読み込みます。
input item $10. +1 amount comma5.;
フォーマット入力でデータを正しく読み込むには、次に示すように2番目のデータ値が最初のデータから10目に位置している必要があります。
----+----1----+----2
trucks    1,382
vans      1,235
sedans    2,391
また、フォーマット入力でITEMの値を読み込んだ後、ポインタコントロールを+1と指定し、AMOUNTの値の開始位置となる列にポインタを移動する必要があります。
データに引用符が含まれる場合
INFILEステートメントにDSDオプションを使用して区切り文字をカンマに変更した場合、値を変数に書き込む前にデータに含まれる引用符が取り除かれます。また、INPUTステートメントでチルダ(~)修飾子を使用すると、引用符を値の一部として保持することができます。

例1: 単純リスト入力を使用した位置が揃っていないデータの読み込み

次のDATAステップのINPUTステートメントでは、単純リスト入力を使用して入力データレコードを読み込みます。
data scores;
   input name $ score1 score2 score3 team $;
   datalines;
Joe 11 32 76 red
Mitchel 13 29 82 blue
Susan 14 27 74 green
;
次のINPUTステートメントでは、前述のデータ行にある最初の4つのフィールドだけを読み込みます。この例で示すように、レコード内のすべてのデータを読み込む必要はありません。
input name $ score1 score2 score3;

例2: ブランクが埋め込まれた文字データの読み込み

次のDATAステップのINPUTステートメントでは、& フォーマット修飾子とリスト入力を組み合わせて、ブランクを含む文字値を読み込みます。
data list;
   infile file-specification;
   input name $ & score;
run;
このステートメントでは、次の入力データレコードが読み込まれます。
----+----1----+----2----+----3----+
Joseph   11 Joergensen  red
Mitchel  13 Mc Allister  blue
Su Ellen  14 Fischer-Simon  green
INPUTステートメントに適用する&修飾子が変数の後ろに指定されています。このフォーマット修飾子はNAMEの後ろにあるので、入力データレコードのNAMEフィールドとSCOREフィールドの間は2つ以上のブランクを使用して区切られている必要があります。
次に示すように、フォーマット修飾子と入力形式を併用することもできます。
    input name $ & +3 lastname & $15. team $;
また、このINPUTステートメントでは読み込むデータは同じですが、入力レコードにあるすべてのデータを読み込む必要はないことを示しています。カラムポインタコントロールが+3と指定されているので、ポインタはSCOREフィールドの位置を通過してLASTNAMEフィールドとTEAMフィールドの値を読み込みます。

例3: 入力形式を使用した位置が揃っていないデータの読み込み

次のDATAステップでは、入力形式付きの修飾リスト入力でデータ値を読み込みます。
data jansales;
   input item : $10. amount;
   datalines;
trucks 1382
vans 1235
sedans 2391
;
$10.入力形式では、文字変数の値として最大10文字まで読み込むことができます。

例4: 入力形式付きのリスト入力を使用したカンマ区切りデータの読み込み

次のDATAステップでは、INFILEステートメントにDELIMITER=オプションを指定して、ブランクのかわりにカンマで区切られた値をリスト入力で読み込みます。例では入力形式を使用して日付を読み込み、出力形式を使用してその日付を書き込みます。
data scores2;
   length Team $ 14;
   infile datalines delimiter=',';
   input Name $ Score1-Score3 Team $ Final_Date:MMDDYY10.;
   format final_date weekdate17.;
   datalines;
Joe,11,32,76,Red Racers,2/3/2007
Mitchell,13,29,82,Blue Bunnies,4/5/2007
Susan,14,27,74,Green Gazelles,11/13/2007
;
proc print data=scores2;
   var Name Team Score1-Score3 Final_Date;
   title 'Soccer Player Scores'; 
run;
カンマで区切られたデータの出力
カンマで区切られたデータの出力

例5: 修飾リスト入力を使用した区切られたデータの読み込み

次のDATAステップでは、INFILEステートメントにDSDオプションを指定し、INPUTステートメントにチルダ(~)フォーマット修飾子を指定します。ここでは、文字データに含まれる引用符は保持されます。また、引用符で囲まれた文字列に含まれる区切り文字は、区切り文字ではなく文字として読み込まれます。
data scores;
   infile datalines dsd;
   input Name : $9. Score1-Score3 
         Team ~ $25. Div $;
   datalines;
Joseph,11,32,76,"Red Racers, Washington",AAA
Mitchel,13,29,82,"Blue Bunnies, Richmond",AAA
Sue Ellen,14,27,74,"Green Gazelles, Atlanta",AA
;
proc print; run;
実行後に作成されたSCORESデータセットをPROC PRINTで出力した結果を次に示します。TEAMの値には引用符が含まれています。
SCORESデータセット
SCORESデータセット

関連項目:

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