当一个输入为空时,sas数据集失败

时间:2016-01-27 01:13:38

标签: sas

我有一个SAS代码,我使用数据集命令来组合3个文件。本周,我们有一些实例,其中一个输入文件的行数为零。这导致文件格式不正确(所有列都是数字),因此数据步骤失败?有没有办法覆盖如果输入行为零则列格式必须一致的要求?

data combined_file; set file1 file2 file3; run;

3 个答案:

答案 0 :(得分:3)

不,我认为你不能克服这种行为。

当您同时设置数据集时,如果在一个数据集中存在数字且在另一个数据集中存在字符,则SAS将抛出错误。在处理任何记录之前,在编译时生成此错误。

我同意@Tom最好的办法是解决为什么用所有数字变量创建数据集的根本问题。

如果需要解决方法,可以考虑使用宏语言检查数据集是否为空。您最终会得到一个宏,它有条件地生成要包含在SET语句中的数据集列表,例如:

%macro ...;
  data combined_file;
    set
      %if %anyobs(file1) %then file1 ;
      %if %anyobs(file2) %then file2 ;
      %if %anyobs(file3) %then file3 ;
    ;
  run;
%mend;

如果您想尝试这种解决方法并想要帮助编写%anyobs,只需删除评论,我就会发布我使用的评论。它基于杰克汉密尔顿的%MTANYOBS,如本文所述:http://www2.sas.com/proceedings/sugi26/p095-26.pdf

答案 1 :(得分:1)

我同意Quentin的问题,但我的解决方案略有不同。

不是在某些%if语句周围有一个包装器宏,而是为设置行写一个宏。

%macro checkAny(ds=);
  %if %anyobs(&ds) %then &ds. ;
%mend checkAny;

data want;
  set
    %checkAny(ds=file1)
    %checkAny(ds=file2)
    %checkAny(ds=file3)
  ;
run;

当然还有Quentin指出的%anyobs宏。

您也可以将其更改为,而不是检查观察结果,检查列是否相同。如果您有特定的列模式,则可以编写一个宏来检查dictionary.columns以验证它们是否完全相同。

答案 2 :(得分:0)

如果问题是跨数据集冲突相同变量名的类型,为什么不直接检查?

PROC CONTENTS DATA=file1 OUT=var1 NOPRINT ;
RUN ;

PROC CONTENTS DATA=file2 OUT=var2 NOPRINT ;
RUN ;

PROC CONTENTS DATA=file3 OUT=var3 NOPRINT ;
RUN ;

PROC SQL ;

  SELECT COUNT(*)
    INTO :bad12
    FROM var1 v1
         INNER JOIN
         var2 v2
           ON UPCASE(v1.name) EQ UPCASE(v2.name)
    WHERE v1.type NE v2.type
  ;

  SELECT COUNT(*)
    INTO :bad13
    FROM var1 v1
         INNER JOIN
         var3 v3
           ON UPCASE(v1.name) EQ UPCASE(v3.name)
    WHERE v1.type NE v3.type
  ;

  SELECT COUNT(*)
    INTO :bad23
    FROM var2 v2
         INNER JOIN
         var3 v3
           ON UPCASE(v2.name) EQ UPCASE(v3.name)
    WHERE v2.type NE v3.type
  ;

QUIT ;

此时你可以查看是否& bad12 +& bad13 +& bad23 EQ 0.如果是,请继续。如果没有,请退出。