2016-04-13 11 views
0

が質問

SASの最後の観察に何かを行うには、1がエンド -flagを設定することができ、例えばは、SASデータセットをマージするとき(のみ)1つのファイルの終わりを検出する方法を

data myResult; 
    merge myInput1 (in=in1) myInput2 (in=in2) end=last; 
    by myKey; 
    ** Do some stuff **; 
    if last then ** Do special stuff **; 
run; 

しかし、私の入力のうちの1つのみに反応するにはどうしたらいいですか? myInput1 (in=in1 end=end1)は機能しません。私は2つの大規模なデータセットの内容を比較するため、999人の観察に限定したい

コンテキスト

myInput1に真ん中に余分な観測値が含まれていると、私のプログラムはそれを報告しますが、句で除外されたmyInput2の行もmyInput1にあります。私は実際に書きたいと思います:

data diff_&memName.; 
    format problem $20.; 
    merge myInput1(in=in1 end=end1 obs=999) 
      myInput2(in=in2 end=end2 obs=999) 

    by moederartikelnr; 
    select; 
     when (end1 or end2) delete; 
     when (not inFrom) problem = "only in 1_PROD"; 
     when (not inTo) problem = "only in 2_DVLP"; 
     when (not first.moederartikelnr or not last.moederartikelnr) 
      problem = 'duplicate key'; 
     otherwise delete; 
    end; 
run; 

あなたが別の方法で私を助けることができる場合は、あまりにもそうしてください。

答えて

1

あなたの文脈を考えれば、1000回の繰り返し後にDATAステップを停止する方が簡単かもしれないと思います。各反復で、1つのレコードがデータセットまたはその両方から読み取られます。 999回の反復の後、999のレコードが読み込まれます(必ずしも両方から999である必要はありません)。この方法では、OBS =オプションは必要ありません。したがって、誤った誤一致を避けることができます。次のようなもの:

data diff_&memName.; 

    if _n_=1000 then stop; *stop on 1000th iteration; 

    format problem $20.; 
    merge myInput1(in=in1) 
      myInput2(in=in2) 
    ; 
    by moederartikelnr; 
    select; 
     when (not in1) problem = "only in myinput2"; 
     when (not in2) problem = "only in myinput1"; 
     when (not first.moederartikelnr or not last.moederartikelnr) 
      problem = 'duplicate key'; 
     otherwise delete; 
    end; 
run; 
関連する問題