最初の行がメタデータ情報を含むヘッダー行であるファイルがあります。
このような特別なデータ行を処理するためにIF句を挿入できるように、SASプロセッサが処理している現在の観測番号(たとえば、最初の観測では= 1)を取得するにはどうすればよいですか。
フォローアップ:最初の行を処理し、さらに処理するために列値の1つをローカル変数に保持したいと思います。この行を最終出力に残したくありません。これは可能ですか?
最初の行がメタデータ情報を含むヘッダー行であるファイルがあります。
このような特別なデータ行を処理するためにIF句を挿入できるように、SASプロセッサが処理している現在の観測番号(たとえば、最初の観測では= 1)を取得するにはどうすればよいですか。
フォローアップ:最初の行を処理し、さらに処理するために列値の1つをローカル変数に保持したいと思います。この行を最終出力に残したくありません。これは可能ですか?
自動変数_N_
は、SAS データ ステップ ループの現在の反復回数を返します。従来のデータステップの場合、つまり:
data something;
set something;
(code);
run;
_N_
行番号に相当します (データ ステップ ループの反復ごとに 1 行が取得されるため)。
したがって、最初の繰り返しで何かを 1 回だけ実行したい場合は、次のようにします。
data something;
set something;
if _n_ = 1 then do;
(code);
end;
(more code);
run;
フォローアップのために、次のようなものが必要です。
data want;
set have;
retain _temp;
if _n_ = 1 then do;
_temp = x;
end;
... more code ...
drop _temp;
run;
DROP ステートメントと RETAIN ステートメントは、コードのどこにでも記述でき、同じ効果があります。私はそれらを論理的な場所に配置しました。RETAIN は、データ ステップ ループのたびに変数を欠損値にリセットしないように指示しているため、さらに下にアクセスできます。
if _n_=1 then
特に大きなテキスト ファイルを読み込んでいる場合は、反復ごとに ( ) 条件を実行する必要を避けたい場合があります。これを行うには、次のようにファイルを 2 回読み取ります。1 回目はヘッダー行を抽出し、2 回目はファイルを読み取ります。
data _null_; /* create dummy file for demo purposes */
file "c:\myfile.txt";
put 'blah'; output;
put 'blah blah blah 666'; output;
data _null_; /* read in header info */
infile "c:\myfile.txt";
input myvar:$10.; /* or wherever the info is that you need */
call symput('myvar',myvar);/* create macro variable with relevant info */
stop; /* no further processing at this point */
data test; /* read in data FROM SECOND LINE */
infile "c:\myfile.txt" firstobs=2 ; /* note the FIRSTOBS option */
input my $ regular $ input $ statement ;
remember="&myvar";
run;
ただし、短い/単純なものについては、ジョーの答えの方が読みやすいので優れています..(小さなファイルの場合はより効率的かもしれません)。