【问题标题】:how to detect the end of (only) one file when merging SAS datasets合并SAS数据集时如何检测(仅)一个文件的结尾
【发布时间】:2016-04-13 10:00:24
【问题描述】:

问题

要对 SAS 中的最后一个 观察 做某事,可以设置一个 end -flag,例如

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;

如果您能以其他方式帮助我,请也这样做。

【问题讨论】:

    标签: merge sas eof


    【解决方案1】:

    鉴于您的上下文,我认为在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      相关资源
      最近更新 更多