前のページ|次のページ

PUTステートメント

SASログ、SASアウトプットウィンドウ、または最後のFILEステートメントに指定した外部の場所に行を出力します。

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

構文

引数なし

引数を指定しないPUTステートメントは、ヌルPUTステートメントと呼ばれます。ヌルPUTステートメントは、次のように動作します。
  • 現在の出力行がブランクの場合でも、現在の出力行を現在の場所に書き込みます。
  • 前回のPUTステートメントの後置@で保持された出力行を解除します。
例については、出力行の保持と解放を参照してください。 詳細については、ラインホールド指定子の使用を参照してください。

引数

specification(s)

書き込む内容、書き込み方法、書き込み先を指定します。specificationには次を指定できます。

variable

変数の名前を指定します。指定した変数の値が書き込まれます。

注: バージョン7から、列をマップしたODS(Output Delivery System)変数をPUTステートメントに指定できます。 この機能の概要については、_ODS_で説明されています。詳細については、XisError: No pubcode in link data found for odsugで説明されています。

(variable-list)

変数のリストを指定します。指定した変数の値が書き込まれます。

要件 (format-list)は(variable-list)の後ろに指定する必要があります。
参照項目 PUTステートメント、フォーマット

'character-string'

書き込む文字列を一重引用符で囲んで指定します。

ヒント 16進数の文字列をEBCDICまたはASCIIで書き込むには、終了引用符の後ろにxを追加します。
間にブランクを含まない一重引用符('')または二重引用符("")の記号のみをテキスト文字列として指定すると、一重引用符( ')または二重引用符(")がそれぞれ出力されます。
参照項目 リスト出力
次のステートメントでは、16進数の文字列をASCII文字に変換してから、HELLOと書き込みます。
put '68656C6C6F'x;

n*

後ろに指定する文字列をn回繰り返します。

次のステートメントでは、出力行にアンダースコアを132回書き込みます。
put 132*'_';
テキストに下線を引く

pointer-control

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

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

column-specifications

値を書き込む出力行内の列位置を指定します。

参照項目 カラム出力
ポインタをページ内で移動させる

format.

変数の値を書き込むときに使用する出力形式を指定します。

参照項目 フォーマット出力
1つのPUTステートメントで複数の出力スタイルを使用する

(format-list)

出力形式のリストを指定します。このリストは、前に指定した変数リストの値を書き込むときに使用します。

制限事項 (format-list)は(variable-list)の後ろに指定する必要があります。
参照項目 PUTステートメント、フォーマット

_INFILE_

現在の入力ファイルから、またはDATELINESステートメントの後ろに指定したデータ行のどちらかから読み込んだ最後の入力データレコードを書き込みます。

ヒント _INFILE_は、現在のINPUTバッファを参照する自動変数です。他のSASステートメントでもこの自動変数を使用できます。
最後に使用したINPUTステートメントが行ポインタコントロールを使用して複数の入力データレコードを読み込む場合、PUT _INFILE_では、入力ポインタが置かれたレコードのみを書き込みます。
次のPUTステートメントでは、1行目の入力データレコードの値をすべて書き込みます。
input #3 score #1 name $ 6-23;
put _infile_;
現在の入力レコードをログに書き込む

_ALL_

現在のDATAステップにて定義されるすべての変数の値を、自動変数を含めて書き込みます。名前付き出力を使用します。

参照項目 名前付き出力

_ODS_

(FILEステートメントのODSオプションで定義される)すべての列のデータ値を特別なバッファに移動します。データの値は移動先からデータコンポーネントに書き込まれます。FILEステートメントのODSオプションは、DATAステップの結果を保持するデータコンポーネントの構造を定義します。

制限事項 _ODS_は、FILEステートメントにODSオプションを事前に指定した場合にのみ使用できます。
操作 _ODS_による特定の列へのデータの書き込みは、PUTステートメントでカラムポインタを使用して、その列に変数を指定していない場合に限られます。つまり、列への変数の指定は、_ODS_オプションより優先されます。
ヒント 変数の指定やカラムポインタと組み合わせて、_ODS_を指定できます。また、PUTステートメントのどの位置にでも指定できます。
参照項目 XisError: No pubcode in link data found for odsug

@|@@

次のPUTステートメントの実行時に使用できるように出力行を保持します。このラインホールド指定子は、後置@および後置@@と呼ばれます。

制限事項 後置@または後置@@は、PUTステートメントの最後の項目として指定する必要があります。
ヒント ポインタを現在の位置に保持するには、@または@@を使用します。次のPUTステートメントは、新しい出力行ではなく同じ出力行に書き込みます。
参照項目 ラインホールド指定子の使用
出力行の保持と解放

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

@n

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

範囲 正の整数
@15が指定されているため、NAMEの値を書き込む前に、ポインタを列15に移動させます。
put @15 name $10.;
ポインタをページ内で移動させる およびテキストに下線を引く

@numeric-variable

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

範囲 正の整数
ヒント nが整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。nが0または負の場合、ポインタは列1に移動します。
変数Aの値に従って、NAME変数の値を書き込む前に、ポインタを列15に移動させます。
a=15;
put @a name $10.;
ポインタをページ内で移動させる

@(expression)

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

範囲 正の整数
ヒント expressionの実行結果が整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。値が0になる場合、ポインタは列1に移動します。
式の結果に従って、NAME変数の値を書き込む前に、ポインタを列15に移動させます。
b=5;
put @(b*3) name $10.;

+n

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

範囲 正の整数または0
ヒント nが整数ではない場合、小数点以下の値を切り捨て、整数の値のみを使用します。
次のステートメントでは、ポインタを列23に移動させ、LENGTHの値を列23から26に書き込みます。次に、ポインタを5列だけ右に移動させ、列32から35にWIDTHの値を書き込みます。
put @23 length 4. +5 width 4.;

+numeric-variable

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

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

+(expression)

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

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

行ポインタコントロール

#n

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

範囲 正の整数
#2と指定されているので、ポインタはIDの値を列3と4に書き込む前に2行目に移動します。
put @12 name $10. #2 id 3-4;

#numeric-variable

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

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

#(expression)

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

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

/

ポインタを次の行の列1に移動させます。

1つまたは複数の“/”行ポインタコントロールを使用してSASログにブランク行を追加しようとしても、ブランク行は生成されません。それ以外の出力形式では、ブランク行が生成されます。
変数NAMEとAGEの値を1行目に書き込んでから、ポインタを2行目に移動させ、列3と4に変数IDの値を書き込みます。
put name age / id 3-4;
ポインタを新しいページに移動させる

OVERPRINT

キーワードOVERPRINTの後ろに指定した値を、直前に書き込んだ出力行に重ねて書き込みます。

要件 この出力はファイルに送信する必要があります。FILEステートメントのN=オプションを1に設定し、PUTステートメントの出力先をファイルに設定してください。
ヒント OVERPRINTは、画面に書き込まれる行には影響しません。
テキストを重ねて出力する場合、カラムポインタコントロールと行ポインタコントロールと組み合わせてOVERPRINTを使用します。
次のステートメントでは列15からアンダースコアを重ねて出力し、タイトルに下線を表示します。
put @15 'Report Title' overprint
    @15 '____________';
テキストに下線を引く

_BLANKPAGE_

ポインタを新しいページの最初の行に移動させます。ポインタが新しいページの最初の行の最初の列にある場合でも移動を実行します。

ヒント 現在の出力ファイルにキャリッジコントロール文字が含まれている場合、_BLANKPAGE_は適切なキャリッジコントロール文字を含む出力行を生成します。
ポインタを新しいページに移動させる

_PAGE_

ポインタを新しいページの最初の行に移動させます。行が現在のPAGESIZE=に指定された値を超えると、自動的に新しいページが開始されます。

ヒント 現在の出力ファイルを書き込む場合に、_PAGE_オプションは適切なキャリッジコントロール文字を含む出力行を生成します。_PAGE_オプションは、書き込まれていないファイルには影響しません。
対話型SASセッションでFILE PRINTを指定すると、アウトプットウィンドウではフォームフィードコントロール文字が改ページと解釈されるので、その文字は出力から削除されます。結果として生成されるファイルは、改ページ文字を含まないフラットファイルになります。フォームフィード文字をファイルに含める必要がある場合、FILEステートメントに物理ファイルの場所とPRINTオプションを指定する必要があります。
ポインタを新しいページに移動させる

詳細

PUTステートメントを使用する必要がある場合

SASログ、SASアウトプットウィンドウ、または外部の場所に行を出力する場合は、PUTステートメントを使用します。DATAステップのの反復時、PUTステートメントの前にFILEステートメントを実行しない場合、行はSASログに書き込まれます。FILEステートメントにPRINTオプションを指定すると、行はSASアウトプットウィンドウに書き込まれます。
PUTステートメントでは、変数の値、文字列、16進数の文字定数を含む行を書き込むことができます。PUTステートメントの指定を使用して、書き込み対象、書き込み先、および書き込み時の出力形式を指定できます。

出力スタイル

出力スタイルの概要

PUTステートメントを使用して変数の値を書き込む場合、次の4つの方法を使用します。
  • カラム
  • リスト(単純および修飾)
  • フォーマット
  • 名前付き
1つのPUTステートメントに、行の出力に合わせて、利用可能な出力スタイルの一部またはすべてを使用できます。

カラム出力

カラム出力を使用する場合、PUTステートメントの変数名の後ろに列番号を指定します。番号は、値を書き込む行内での位置を示しています。
put name 6-15 age 17-19;
次の行がSASログに書き込まれます。
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
----+----1----+----2----+
     Peterson    21
     Morgan      17
PUTステートメントによって、変数NAMEとAGEの値が指定した列に書き込まれます。詳細については、PUTステートメント、カラムを参照してください。

リスト出力

リスト出力を使用する場合、書き込む順序でPUTステートメントに変数と文字列を指定します。例えば、このPUTステートメントによって、NAMEとAGEの値はSASログに書き込まれます。
put name age;
次にSASログを示します。
----+----1----+----2----+
Peterson 21
Morgan 17
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
詳細については、PUTステートメント、リストを参照してください。

フォーマット出力

フォーマット出力を使用する場合、変数名の後ろにSAS出力形式またはユーザー定義の出力形式を指定します。この出力形式によって、変数の値を書き込む方法が指示されます。出力形式を指定すると、パック10進などの非標準形式のデータや、カンマなどの特殊文字を含む数値を書き込むことができます。-L、-C、-Rを使用すると、フォーマット出力のデフォルトの配置より優先されます。
例えば、このPUTステートメントによって、NAME、AGE、およびDATEの値はSASログに書き込まれます。
put name $char10. age 2. +1 date mmddyy10.;
次にSASログを示します。
----+----1----+----2----+
Peterson  21 07/18/1999
Morgan    17 11/12/1999
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
ポインタコントロールを+1と指定すると、変数AGEとDATEの値の間にブランクが1つ挿入されます。詳細については、PUTステートメント、フォーマットを参照してください。

名前付き出力

名前付き出力を使用する場合、変数名の前に等号を付けてリストします。例えば、このPUTステートメントによって、NAMEとAGEの値はSASログに書き込まれます。
put name= age=;
次にSASログを示します。
----+----1----+----2----+
name=Peterson age=21
name=Morgan age=17
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
詳細については、PUTステートメント、名前付きを参照してください。

1つのPUTステートメントで複数の出力スタイルを使用する

1つのPUTステートメントに、異なる出力スタイルの一部またはすべてを組み合わせて使用することができます。次に例を示します。
put name 'on ' date mmddyy8. ' weighs '
    startwght +(-1) '.' idno= 40-45;
SASログへの行の書き込みについては、1つのPUTステートメントで複数の出力スタイルを使用するを参照してください。
異なる出力スタイルを組み合わせて使用する場合、それぞれの値を書き込んだ後の出力ポインタの位置を理解することが重要です。ポインタの位置の詳細については、値を書き込んだ後のポインタの位置を参照してください。

文字定数と変数の書き込み時によく発生するエラーを回避する

PUTステートメントを使用して文字定数の後ろに変数名を書き込む場合、終了引用符と変数名の間に常にブランクを1つ追加します。
put 'Player:' name1 'Player:' name2 'Player:' name3;
ブランクを追加しないと、次の表に示すように、変数名が後ろに続く文字定数は特殊なSAS定数と解釈される場合があります。
文字定数の後ろに追加すると正しく解釈されない文字
変数の開始文字
説明
b
ビットテスト定数
'00100000'b
d
日付定数
'01jan04'd
dt
日時定数
'18jan2003:9:27:05am'dt
n
名前リテラル
'My Table'n
t
時間定数
'9:25:19pm't
x
16進法表記
'534153'x
変数が後ろに続く文字定数の書き込み時によく発生するエラーを回避する では、文字定数の後に変数を使用する方法について説明しています。式で使用するSAS名前リテラルおよびSAS定数の詳細については、を参照してください。

ポインタコントロール

PUTステートメントの値を書き込むときは、ポインタを使用して書き込み位置を制御します。PUTステートメントには、ポインタの動きを制御する3つの方法があります。
カラムポインタコントロール
PUTステートメントで出力行への値の書き込みを開始するときに、ポインタの列の位置をリセットします。
行ポインタコントロール
PUTステートメントで出力行に書き込むときに、ポインタの行の位置をリセットします。
ラインホールド指定子
出力バッファに行が保持されるので、他のPUTステートメントでも同じ行に書き込むことができます。デフォルトでは、PUTステートメントを実行すると、以前の行を解放して、新しい行に書き込みます。
カラムポインタコントロールや行ポインタコントロールを使用すると、ポインタを移動させる行または列の絶対位置を指定したり、現在のポインタの位置の相対位置として移動先の列または行を指定できます。PUTステートメントで指定できるすべてのポインタコントロールを次の表に示します。
PUTステートメントで指定できるポインタコントロール
ポインタコントロール
相対指定
絶対指定
カラムポインタコントロール
+n
@n
+numeric-variable
@numeric-variable
+(expression)
@(expression)
行ポインタコントロール
/、_PAGE_、
_BLANKPAGE_
#n
#numeric-variable
#(expression)
OVERPRINT
なし
ラインホールド指定子
@
(なし)
@@
(なし)
注: ポインタコントロールは、常に適用する変数の前に指定するようにしてください。
SASでポインタ位置を特定する方法については、値を書き込んだ後のポインタの位置を参照してください。

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

ラインホールド指定子を使用して、次の場合にポインタを現在の出力行に保持します。
  • 複数のPUTステートメントを使用して値を同じ出力行に書き込む場合
  • 1つのPUTステートメントを使用して複数のオブザベーションの値を同じ出力行に書き込む場合
ラインホールド指定子を指定しない場合、DATAステップのPUTステートメントごとに値が新しい出力行に書き込まれます。
PUTステートメントでは、後置@と後置@@は同じ働きをします。INPUTステートメントとは異なり、PUTステートメントでは、DATAステップの新しい繰り返しの開始時に、後置@で保持されている行は自動的に解放されません。後置@または後置@@で保持されている現在の出力行は、次の場合に解放されます。
  • PUTステートメントに後置@が指定されていない場合
  • PUTステートメントに_BLANKPAGE_または_PAGE_が指定されている場合
  • 現在の行の行端に達した場合(FILEステートメントのLRECL=オプションまたはLINESIZE=オプションの現在の値、または指定されている場合にはLINESIZE=システムオプションの現在の値により決定)
  • DATAステップで最後の繰り返しが終了した場合
後置@または後置@@を使用すると、次のPUTステートメントの実行時にポインタの値が変更されないので、現在の行の長さを超えても値を書き込もうとする場合があります。 この出力の内容についてはポインタが行の終わりを超える場合を参照してください。

値を書き込んだ後のポインタの位置

1つのPUTステートメントで複数の出力スタイルを組み合わせて使用する場合は、値を書き込んだ後の出力ポインタの位置を理解しておくことが重要になります。値を書き込んだ後のポインタの位置は、指定した出力スタイルや、書き込んだ値が文字列か変数かによって異なります。カラム出力またはフォーマット出力を使用すると、ポインタの位置はPUTステートメントに指定したフィールドの最後から1番目の列になります。この2つのスタイルでは、変数の値のみが書き込まれます。
リスト出力と名前付き出力を使用すると、PUTステートメントでは、それぞれの値を書き込んだ後に列を1つ自動的にスキップするので、ポインタの位置は変数の値の最後から2番目の列になります。ただし、PUTステートメントでリスト出力を使用して文字列を書き込む場合、ポインタの位置は文字列の最後から1番目の列になります。文字列を書き込んだ後に行ポインタコントロールやカラム出力を使用しない場合、文字列と次の値を区切るため、文字列の最後にブランクを1つ追加してください。
_INFILE_の指定時、ポインタは現在の入力ファイルのレコードを書き込んだ後に列1に配置されます。
出力ポインタは、次の場合にページの上部左端に表示されます。
  • PUT _BLANKPAGE_がブランクページを書き込み、ポインタを次のページの先頭に移動させた場合
  • PUT _PAGE_が同じ位置にポインタを保持する場合
FILEステートメントのCOLUMN=オプションまたはLINE=オプションに指定した変数の値を調べて、現在のポインタの位置を特定できます。

ポインタが行の終わりを超える場合

現在指定されている出力行の長さを超える場合、出力行は書き込まれません。現在の出力行の長さは次の値で決定されます。
  • 現在のFILEステートメントのLINESIZE=オプションの値
  • LINESIZE=システムオプションの値(SASアウトプットウィンドウの場合)
  • 現在のFILEステートメントのLRECL=オプションの値(外部ファイルの場合)
次に示す指定を1つまたは複数使用すると、ポインタの位置が誤って現在の行の長さを超えてしまう場合があります。
  • 現在の行の長さを超えた列にポインタを移動させるように+ポインタコントロールの値が指定されている場合
  • 列範囲が現在の行の長さを超えている場合(たとえば、現在の行の長さが80の場合にPUT X 90 - 100 と指定する場合)
  • 変数の値または文字列が現在の出力行のスペースよりも長い場合
デフォルトでは、PUTステートメントが現在の行の終わりを超えて書き込む必要がある場合、現在の行に収まらない項目の書き込みは行わずに、現在の行の書き込みを終了します。次に、現在の行に書き込めなかった項目を新しい行の列1から書き込みます。 FILEステートメントのFLOWOVERオプション、DROPOVERオプション、STOPOVERオプションを参照してください。

配列

PUTステートメントを使用して配列要素を書き込むことができます。subscriptには、PUTステートメントの実行時に結果が整数になるSAS式を指定できます。次に示すように、配列参照を丸かっこで囲むと、ポインタコントロール付きのnumeric-variableの構文に配列参照を使用できます。
  • @(array-name{i})
  • +(array-name{i})
  • #(array-name{i})
事前に定義した配列のすべての要素を外部の場所に書き込むには、配列のsubscriptにアスタリスク(*)を使用します。1次元配列または多次元配列は使用できますが、_TEMPORARY_配列は使用できません。subscriptを中かっこ、大かっこ、丸かっこで囲みます。次に、リスト出力、フォーマット出力、カラム出力、名前付き出力を使用して配列を書き込みます。リスト出力を使用する場合、ステートメントの形式は次のようになります。
PUT array-name{*};
フォーマット出力を使用する場合、ステートメントの形式は次のようになります。
PUT array-name{*}(format|format.list)
丸かっこで囲んだ出力形式は、配列参照の後ろに続けて指定します。

比較

  • PUTステートメントでは変数の値や文字列をSASログや外部の場所に書き込みますが、INPUTステートメントでは外部ファイルの生データやインストリームで入力されるデータ行を読み込みます。
  • INPUTステートメントとPUTステートメントのどちらも、後置@や後置@@ラインホールド指定子を使用すると、入力バッファや出力バッファ内に現在の行が保持されます。INPUTステートメントでは、後置@@を使用して入力バッファに行を保持し、DATAステップの繰り返し時にそのまま使用します。PUTステートメントでは、後置@は後置@@と同じ動作になります。どちらを使用しても、DATAステップの反復間を通して行を保持します。
  • PUTステートメントとOUTPUTステートメントはどちらもDATAステップで出力を生成します。PUTステートメントは出力バッファを使用し、外部の場所、SASログ、またはモニタに出力を書き込みます。OUTPUTステートメントは、プログラムデータベクトルを使用し、SASデータセットにオブザベーションを書き込みます。

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

この例では、1つのPUTステートメントで複数の出力スタイルを使用します。
data club1;
   input idno name $ startwght date : date7.;
   put name 'on ' date mmddyy8. ' weighs '
       startwght +(-1) '.' idno= 32-40;
   datalines;
032 David 180 25nov99
049 Amelia 145 25nov99
219 Alan 210 12nov99
;
この例の各変数に指定されている出力スタイルを次の表に示します。
変数
出力スタイル
NAME, STARTWGHT
リスト出力
DATE
フォーマット出力
IDNO
名前付き出力
このPUTステートメントではポインタコントロールも使用しています。また、文字列と変数名も指定しています。
このプログラムを実行すると、次の行がSASログに出力されます。
----+----1----+----2----+----3----+----4
David on 11/25/99 weighs 180.  idno=1032
Amelia on 11/25/99 weighs 145. idno=1049
Alan on 11/12/99 weighs 210.   idno=1219
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
文字列の先頭と末尾にブランクが挿入されているので、ポインタの位置が移動します。このブランクによって、変数の値と文字列が区切られています。ポインタコントロールを+(-1)と指定しているので、ポインタが後方(左)に移動し、STARTWGHTの値とピリオドの間の不要なブランクが削除されます。 ポインタ位置を指定する方法の詳細については、値を書き込んだ後のポインタの位置を参照してください。

例2: ポインタをページ内で移動させる

次のPUTステートメントは、カラムポインタコントロールと行ポインタコントロールを使用して出力ポインタの位置を指定する方法を示しています。
  • ポインタを特定の列に移動させるには、@の後ろに列番号か、列番号の値を示す変数や式を指定します。たとえば、次のステートメントではポインタを列15に移動してから、リスト出力を使用して変数TOTAL SALESの値を書き込みます。
    put @15 totalsales;
    次のPUTステートメントでは、ポインタを変数COLUMNに指定した値に移動した後、COMMA6出力形式を使用して変数OTAL SALESの値を書き込みます。
    data _null_;
       set carsales;
       column=15;
       put @column totalsales comma6.;
    run;
  • 次のプログラムでは、ポインタを戻す2つの方法を示しています。
    data carsales;
       input item $10. jan : comma5.
             feb : comma5. mar : comma5.;
       saleqtr1=sum(jan,feb,mar);
    /* an expression moves pointer backward */
       put '1st qtr sales for ' item
           'is ' saleqtr1 : comma6. +(-1) '.';
    /* a numeric variable with a negative
        value moves pointer backward.      */
       x=-1;
       put '1st qtr sales for ' item
           'is ' saleqtr1 : comma5. +x '.';
       datalines;
    trucks         1,382     2,789     3,556
    vans           1,265     2,543     3,987
    sedans         2,391     3,011     3,658
    ;
    SALEQTR1の値は修飾リスト出力を使用して書き込まれるので、ポインタは自動的に2列先に移動します。 詳細については、修飾リスト出力とフォーマット出力の違いを参照してください。値とピリオドの間の不要なブランクを削除するために、ポインタを1列だけ戻します。
    このプログラムを実行すると、次の行がSASログに出力されます。
    ----+----1----+----2----+----3----+----4
    st qtr sales for trucks is 7,727.
    st qtr sales for trucks is 7,727.
    st qtr sales for vans is 7,795.
    st qtr sales for vans is 7,795.
    st qtr sales for sedans is 9,060.
    st qtr sales for sedans is 9,060.
    注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
  • 次のプログラムでは、PUTステートメントと行ポインタコントロール(/)を使用して、次行にポインタを移動させます。
    data _null_;
       set carsales end=lastrec;
       totalsales+saleqtr1;
       if lastrec then
         put @2 'Total Sales for 1st Qtr'
             / totalsales 10-15;
    run;
    このDATAステップでは、CARSALESデータセット内のすべてのオブザベーションを使用してTOTALSALESの値を算出した後、PUTステートメントを実行します。列2から文字列を書き込み、次の行に移動してから列10から15にTOTALSALESの値を書き込みます。
    ----+----1----+----2----+----3
     Total Sales for 1st Qtr
              24582
    注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。

例3: ポインタを新しいページに移動させる

この例ではSTATEPOPというデータセットを作成します。このデータセットには、1990年の米国国勢調査の都市圏と非都市圏の人口に関する情報が含まれています。ここでは、FORMATプロシジャを実行し、50州とコロンビア特別区を4つの地域にグループ化しています。次に、IFステートメントとPUTステートメントを使用して出力を制御しています。
title1;
data statepop;
   input state $ cityp90 ncityp90 region @@;
   label cityp90= '1990 metropolitan population 
                        (million)'
         ncityp90='1990 nonmetropolitan population
                        (million)'
         region=  'Geographic region';
   datalines;
ME    .443    .785  1   NH    .659    .450  1
VT    .152    .411  1   MA   5.788    .229  1
RI    .938    .065  1   CT   3.148    .140  1
NY  16.515   1.475  1   NJ   7.730     .A   1
PA  10.083   1.799  1   DE    .553    .113  2
MD   4.439    .343  2   DC    .607      .   2
VA   4.773   1.414  2   WV    .748   1.045  2
NC   4.376   2.253  2   SC   2.423   1.064  2
GA   4.352   2.127  2   FL  12.023    .915  2
KY   1.780   1.906  2   TN   3.298   1.579  2
AL   2.710   1.331  2   MS    .776   1.798  2
AR   1.040   1.311  2   LA   3.160   1.060  2
OK   1.870   1.276  2   TX  14.166   2.821  2
OH   8.826   2.021  3   IN   3.962   1.582  3
IL   9.574   1.857  3   MI   7.698   1.598  3
WI   3.331   1.561  3   MN   3.011   1.364  3
IA   1.200   1.577  3   MO   3.491   1.626  3
ND    .257    .381  3   SD    .221    .475  3
NE    .787    .791  3   KS   1.333   1.145  3
MT    .191    .608  4   ID    .296    .711  4
WY    .134    .319  4   CO   2.686    .608  4
NM    .842    .673  4   AZ   3.106    .559  4
UT   1.336    .387  4   NV   1.014    .183  4
WA   4.036    .830  4   OR   1.985    .858  4
CA  28.799    .961  4   AK    .226    .324  4
HI    .836    .272  4
;
proc format;
   value regfmt 1='Northeast'
                2='South'
                3='Midwest'
                4='West';
run;
data _null_;
   set statepop;
   by region;
   pop90=sum(cityp90,ncityp90);
   file print;
   put state 1-2 @5 pop90 7.3 ' million';
   if first.region then
      regioncitypop=0;      /* new region */
   regioncitypop+cityp90;
   if last.region then
      do;
         put // '1990 US CENSUS for ' region regfmt.
              / 'Total Urban Population: ' 
                 regioncitypop' million' _page_;
      end;
run;
PUTステートメントを使用した北東地域の出力結果
                                                               1 ME 1.228 million NH 1.109 million VT 0.563 million MA 6.017 million RI 1.003 million CT 3.288 million NY 17.990 million NJ 7.730 million PA 11.882 million 1990 US CENSUS for Northeast Total Urban Population:45.456 million
LAST.REGIONの値が1の場合、PUT _PAGE_ はポインタを新しいページの1行に移動させます。例では、ページから移動の前にフッターメッセージが表示されます。

例4: テキストに下線を引く

この例では、OVERPRINTを使用し、直前のPUTステートメントで書き込んだ値の下に下線を表示します。
data _null_;
   input idno name $ startwght;
   file file-specification print;
   put name 1-10 @15 startwght 3.;
   if startwght > 200 then
     put overprint @15 '___';
   datalines;
032 David 180
049 Amelia 145
219 Alan 210
;
2番目のPUTステートメントでは、最初のPUTステートメントで書き込んだ体重の値が200ポンドを超えていた場合に下線を引きます。
次のPUTステートメントでは、カラムポインタコントロールと行ポインタコントロールとともにOVERPRINTを使用しています。
   put @5 name $8. overprint @5 8*'_'
     / @20 address;
このPUTステートメントでは、変数NAMEの値を書き込んでから、8個のアンダースコアを重ねて下線を引きます。その後、出力ポインタを次の行に移動させ、変数ADDRESSの値を書き込みます。

例5: 出力行の保持と解放

次のDATAステップでは、PUTステートメントで出力行の保持と解放を行う方法を示します。
data _null_;
   input idno name $ startwght 3.;
   put name @;
   if startwght ne . then
     put @15 startwght;
   else put;
   datalines;
032 David 180
049 Amelia 145
126 Monica
219 Alan 210
;
この例では、
  • 最初のPUTステートメントに後置@を指定し、変数NAMEの値を書き込んだ後、現在の出力行を保持します。
  • IF-THENステートメントの条件が真になる場合、2番目のPUTステートメントでSTARTWGHTの値を書き込んでから、現在の出力行を解放します。
  • 条件が偽になる場合、2番目のPUTステートメントは実行されません。かわりに、ELSE PUTステートメントが実行されます。ELSE PUTステートメントで出力行を解放した後、出力ポインタを出力バッファの列1に移動します。
このプログラムを実行すると、次の行がSASログに出力されます。
----+----1----+----2
David         180
Amelia        145
Monica
Alan          210
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。

例6: 現在の入力レコードをログに書き込む

IDの値が1000未満の場合、PUT _INFILE_を実行し、現在の入力レコードをSASログに書き込みます。DELETEステートメントを実行することによって、DATAステップでTEAMデータセットにオブザベーションが書き込まれないようにします。
data team;
   input id team $ score1 score2;
   if id le 1000 then
     do;
       put _infile_;
       delete;
     end;
   datalines;
032 red 180 165
049 yellow 145 124
219 red 210 192
;
このプログラムを実行すると、次の行がSASログに書き込まれます。
----+----1----+----2
219 red 210 192
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。

例7: 変数が後ろに続く文字定数の書き込み時によく発生するエラーを回避する

この例では、SAS名前リテラルとして誤って解釈されないように、PUTステートメントを使用して文字リテラルと変数の値を書き込む方法を示します。SAS名前リテラルとは、引用符で囲んだ文字列として表される名前トークンで、この文字列の後ろに文字nが追加されます。SAS名前リテラルの詳細については、SAS言語リファレンス: 解説編を参照してください。
次のプログラムでは、PUTステートメントは変数NVAR1の値が後ろに続く定数'n'を書き込んでから、別の定数'n'書き込みます。
data _null_;
   n=5; 
   nvar1=1; 
   var1=7; 
   put @1 'n' nvar1 'n';
run;
このプログラムを実行すると、次の行がSASログに書き込まれます。
----+----1----+----2
n1 n
注: 理解しやすいようにルーラー付きの行が表示されていますが、PUTステートメントではこの行は生成されません。
前述のPUTステートメントから定数と変数の間にあるブランクをすべて削除すると、'n'は定数として読み込まれずに、名前リテラルと解釈されます。次の変数は、NVAR1ではなくVAR1として読み込まれます。最後の定数'n'は正しく解釈されます。
put @1 'n'nvar1'n';
このPUTステートメントを実行すると、次の行がSASログに書き込まれます。
----+----1----+----2
5 7 n
文字定数と変数の値の間にブランクを追加した後、必要に応じてポインタコントロールを使用すると、誤った解釈を潜在的に発生させることなく、文字定数と変数の値の間にブランクを挿入することなく書き込まれます。たとえば、次のPUTステートメントではポインタコントロールを使用して正しい文字定数と変数の値を書き込みますが、ブランクは挿入されません。+(-1)と指定すると、PUTステートメントでポインタが1列だけ戻ります。
put @1 'n' nvar1 +(-1) 'n';
このPUTステートメントを実行すると、次の行がSASログに書き込まれます。
----+----1----+----2
n1n

例8: 複数の列で構成される出力を作成する

この例では、#n行ポインタコントロールと@nカラムポインタコントロールを使用して複数の列で構成される出力を作成します。
/*
 * Use #i and @j to position name and weight information into
 *  four columns in column-major order.  That is print down column 1
 *  first, then print down column 2, etc.
 * This example highlights the need to specify # before @ because
 *  # sets the column pointer to 1.
 */
data _null_;
   file print n=ps notitles header=hd;

   do i = 1 to 80 by 20;
      do j = 1 to ceil(num_students/4);
         set sashelp.class nobs=num_students;
         put #(j+3) @i name $8. '-' +1 weight 5.1;
      end;
   end;
   stop;

hd:
   put @26 'Student Weight in Pounds' / @26 24*'-';
   return;
run;
このプログラムを実行すると、次の出力が作成されます。
                         Student Weight in Pounds ------------------------ Alfred - 112.5 James - 83.0 Joyce - 50.5 Robert - 128.0 Alice - 84.0 Jane - 84.5 Judy - 90.0 Ronald - 133.0 Barbara - 98.0 Janet - 112.5 Louise - 77.0 Thomas - 85.0 Carol - 102.5 Jeffrey - 84.0 Mary - 112.0 William - 112.0 Henry - 102.5 John - 99.5 Philip - 150.0

関連項目:

システムオプション:
XisError: No pubcode in link data found for lesysoptsref
XisError: No pubcode in link data found for lesysoptsref
前のページ|次のページ|ページの先頭へ