如何在合并SAS数据集时检测(仅)一个文件的末尾



问题

要对SAS中的最后一次观察进行操作,可以设置结束标志,例如

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

但是,当我的一个输入到达终点时,我该如何反应呢?myInput1 (in=in1 end=end1)不工作。

上下文

我想比较两个大型数据集的内容,从而将观测值限制在999。如果myInput1在中间包含一些额外的观察结果,我的程序会报告这一点,但也会报告myInput2中被myInput1中的obs=999子句排除的一些行。我实际上想写:

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;

如果你能用另一种方式帮助我,也请这样做。

考虑到您的上下文,我认为在1000次迭代后停止DATA步骤可能更容易。在每次迭代中,从数据集或两者中读取一条记录。因此,在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;

相关内容

最新更新