在宏中嵌套 SAS 宏以处理项目的子集

Nesting a SAS macro in a macro to process a subset of items

我有一组名为 m6.csv 到 m22.csv 的 csv 文件,其中文件名中的数字随着每个新文件递增 1。所有的数据集都有一个名为passedchecks的变量,但只有部分数据集有用。我想对几个(但不是全部)数据集(m8、m13、m18 和 m19)进行子集化,并且只包括 passedchecks = 1 的观察结果,因为它们被读入 SAS 而无需为这些数据编写单独的宏数据集。

当前宏使用 proc import 读取 csv 文件,然后通过 passedchecks 标志对新 SAS 数据集 所有 进行子集化 - 不是只有四个感兴趣。最后将所有数据集的内容打印到控制台。

%let rawcsv = C:\Users\Desktop\rawfolder\;

%macro inputter(first=6, last=22); /*change this when m20-m22 come in for wave 3 (DONE ON 03/02/2021)*/
%do i=&first. %to &last. %by 1;

proc import datafile="&&rawcsv.m&&i..csv" 
                 out=m&i replace 
                dbms=csv; 
        guessingrows=500;
run;

/*BEGIN: part I just want to do where i = 8, 13, 18, and 19*/

data m&i;
set m&i;
where passedchecks=1;
run;

/*END: part I just want to do where i = 8, 13, 18, and 19*/

proc contents data=m&i varnum; 
title2 "contents of m&&i file"; 
run;

%end;
%mend;

%inputter;

有没有办法修改它,使其以不同于其他数据集的方式处理 m8、m13、m18 和 m19 数据集?

当然可以。添加条件以检查这些值。我们将添加 minoperatormindelimiter=' ' 选项并检查 &i 是否在我们指定的 space 分隔列表中。此选项告诉宏工具将 IN 视为运算符并使用 spaces 分隔要检查的值。例如:&color IN red green blue;

%macro inputter(first=6, last=22, checkData=) / minoperator mindelimiter=' ';
    /*change this when m20-m22 come in for wave 3 (DONE ON 03/02/2021)*/

    /* Clean checkData of any extra spaces */
    %let checkData = %cmpres(&checkData.);

    %do i=&first. %to &last. %by 1;
    
        proc import datafile="&&rawcsv.m&&i..csv" 
                         out=m&i replace 
                        dbms=csv; 
                guessingrows=500;
        run;
    
        /*BEGIN: part I just want to do where i = 8, 13, 18, and 19*/
        
        %if(&i. IN &checkData.) %then %do;
            data m&i;
                set m&i;
                where passedchecks=1;
            run;
        %end;

        /*END: part I just want to do where i = 8, 13, 18, and 19*/
        
        proc contents data=m&i varnum; 
        title2 "contents of m&&i file"; 
        run;
    
    %end;
%mend;
    
%inputter(checkData=8 13 18 19);