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

Loops 在宏中嵌套SAS宏以处理项目子集,loops,sas,conditional-statements,sas-macro,datastep,Loops,Sas,Conditional Statements,Sas Macro,Datastep,我有一组名为m6.csv到m22.csv的csv文件,其中文件名中的数字随着每个新文件的增加而增加1。所有数据集都有一个名为passedchecks的变量,但只有在某些数据集中它才有用。我想对几个(但不是全部)数据集(m8、m13、m18和m19)进行子集,只包括通过检查的观察值,因为它们被读入SAS,而不为这些数据集编写单独的宏 当前宏使用proc import读取csv文件,然后通过passedchecks标志将所有新SAS数据集子集化,而不仅仅是感兴趣的四个。最后将所有数据集的内容打印到控

我有一组名为m6.csv到m22.csv的csv文件,其中文件名中的数字随着每个新文件的增加而增加1。所有数据集都有一个名为
passedchecks
的变量,但只有在某些数据集中它才有用。我想对几个(但不是全部)数据集(m8、m13、m18和m19)进行子集,只包括
通过检查的观察值,因为它们被读入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
是否在指定的空格分隔列表中。此选项告知宏工具将
中的
视为运算符,并使用空格分隔要检查的值。例如:
&红色、绿色、蓝色

%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);

为什么要使用PROC导入来读取文本文件?它必须猜测如何定义变量。因此,每个文本文件都可以生成具有不同变量属性的数据集。只需编写自己的数据步骤来读取文本文件,这样就可以完全控制变量的定义方式。这些是csv文件,每个文件中有数千个变量。顺序、结构和变量名也各不相同,如果我添加更多文件(例如,和m23.csv),这使得数据步骤解决方案大大增加了时间密集度,并且不易复制。猜测行需要更多的计算时间,但需要花费更少的时间。每个变量的内容都足够可靠,因此不必担心整个“不同的变量属性”。虽然(此处未显示)我合并了proc内容结果并进行检查。