首页 > 解决方案 > 如何根据 SAS 工作文件中的观察数运行部分宏

问题描述

我对在 SAS 上做宏很陌生,所以如果我的问题看起来很基本,请提前道歉。

如果在临时工作文件中找到最少数量的观察,我希望执行部分宏。

如果有最少数量的观察,宏应该执行该临时工作文件的 proc 导出,否则它只会在日志上产生错误消息。

我不确定我做错了什么,临时工作文件有超过 1 个观察值,我希望宏运行,但是它会产生错误消息,就好像它小于最小值一样。

以下是我迄今为止创建的代码 - 您提供的任何帮助都将受到欢迎。

data original_data;
set data.dataset;

keep column1 column2 column3 ;
run;


%macro test_macro;

%let dsid=%sysfunc(open(work.original_data));
%let nobs=%sysfunc(attrn(&dsid,nobs));
%let dsid=%sysfunc(close(&dsid));


%if &nobs >1 %then %do;
%put ERROR: No observations counted;
%return
%end

%else %do;

proc export data=submissions
        outfile='C:\Users\myusername\Desktop\test.csv'
        DBMS=csv replace; 
run;

%end;

%mend test_macro;

%test_macro

标签: sassas-macro

解决方案


  1. RETURN 和 END 语句中缺少分号
  2. 逻辑颠倒了。如果您有多个观察结果,则您正在输入错误消息。如果您有多个观察结果,请翻转您的代码以便导出。
options mprint symbolgen;

%macro test_macro;
    %let dsid=%sysfunc(open(work.original_data));
    %let nobs=%sysfunc(attrn(&dsid, nobs));
    %let dsid=%sysfunc(close(&dsid));
    %put &nobs;
    *if more than one observation;

    %if &nobs > 1 %then
        %do;

            proc export data=sashelp.class outfile='/home/fkhurshed/test.csv' DBMS=csv 
                    replace;
            run;

        %end;
    %else
        %do;
            %put ERROR: No observations counted;
            %return;
        %end;
%mend test_macro;

%test_macro;

推荐阅读