在宏中嵌套 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 数据集?
当然可以。添加条件以检查这些值。我们将添加 minoperator
和 mindelimiter=' '
选项并检查 &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);
我有一组名为 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 数据集?
当然可以。添加条件以检查这些值。我们将添加 minoperator
和 mindelimiter=' '
选项并检查 &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);