首页 文章

SAS%DO循环以检索多个数据集

提问于
浏览
0

我正在尝试使用%DO循环来附加多个月度数据文件 . 这是我到目前为止的代码:

options mprint symbolgen source mlogic merror syntaxcheck ;


%MACRO INT;

%DO i=01 %TO 03 %BY 1;

libname appd "Qual1.Qual2.Qual3.QUAL416&i." disp=shr;

data work&i.;
set appd.file;
run;

data final;
set work;
run;

proc append data=work&i.
            base=final;
run;

%MEND;

%INT;

我收到一个错误:

警告:当前正在处理的带引号的字符串长度超过262个字符 . 您可能有不 balancer 的引号 .

我不完全确定这意味着什么 . 我想明确地编写 %DO i=1601 %TO 1612 %BY 1 代码,因为我必须每年更改它,例如如果我在2010年开始,我将不得不编码2010年,然后是2011年的单独 %DO 声明等等,直到2016年 . 这听起来不是很多,但十年之内>它可以 .

更新:我更改了我的代码以包含此位:

`%DO i=1005 %TO 1607;
%IF i=1013 %THEN %DO i=1101 %TO 1112;
/*%ELSE %IF i=1113 %THEN %DO i=1201 %TO 1212;*/
/*%ELSE %IF i=1213 %THEN %DO i=1301 %TO 1312;*/
/*%ELSE %IF i=1313 %THEN %DO i=1401 %TO 1412;*/
/*%ELSE %IF i=1413 %THEN %DO i= 1501 %TO 1512;*/
/*%ELSE %IF i=1513 %THEN %DO i=1601 %TO 1607;*/`

它有点笨拙,但我认为它只能循环到年底,然后在 i=1012 to i=1101 之后开始下一次迭代 . 但是,这是我的日志中发生的事情:

MLOGIC(INT):  %DO loop index variable I is now 1012; loop will iterate again. 
 MLOGIC(INT):  %IF condition i=1013 is FALSE 
 MLOGIC(INT):  %DO loop index variable I is now 1013; loop will iterate again. 
 MLOGIC(INT):  %IF condition i=1013 is FALSE

SAS如何处理这种情况?它告诉我变量 i = 1013%IF 条件 i=1013 是假的?为什么这不正确?

3 回答

  • 2

    我认为在使用日期时,您应该始终使用日期值,而不是尝试使用数年或数月或其他此类“快捷方式”来快捷方式 . 根据我的经验,这些总是导致令人困惑和错误的代码 .

    下面是一个宏,显示如何传递开始日期和结束日期(甚至不必是月份的第1天),它将返回相应的月份名称 . 然后,您可以根据需要对其进行调整以使用 proc append 或其他代码 .

    它实际上需要2个日期值作为参数 . 然后使用 %do %while 循环和 intnx() 函数一次从开始日期到结束日期循环1个月 . 我使用 %sysfunc(sum(),yymmn4.) 来计算每月数据集的所需格式并将其打印到日志中 .

    Code:

    %macro append_monthly(iStart_date=, iEnd_date=);
    
      %local tmp_date id;
      %let tmp_date = %sysfunc(intnx(month,&iStart_date,0,beginning)) ;
    
      %do %while (&tmp_date le &iEnd_date);
    
        %let id = %sysfunc(sum(&tmp_date),yymmn4.);
        %put &=id;
    
        %let tmp_date = %sysfunc(intnx(month,&tmp_date,1,beginning)) ;
    
      %end;
    
    %mend;
    %append_monthly(iStart_date=%sysfunc(mdy(1,1,2010)),  iEnd_date=%sysfunc(mdy(1,1,2013)) );
    

    请注意, %sysfunc(sum(&tmp_date),yymmn4.) 是一种在使用宏时格式化数字的快捷方式 . %sysfunc() 要求我们提供一个函数作为第一个参数,您可以选择提供一个格式作为第二个参数 . sum() 函数很方便,因为它保持数值不变 .

    Output:

    ID=1001
    ID=1002
    ID=1003
    ...
    ID=1011
    ID=1012
    ID=1101
    ID=1102
    ID=1103
    ...
    ID=1110
    ID=1111
    ID=1112
    ID=1201
    ID=1202
    ID=1203
    ...
    ID=1210
    ID=1211
    ID=1212
    ID=1301
    
  • 2

    这是进行这种循环的一种方法:

    %macro month_loop(MTH_FROM, MTH_TO);
      %local T_MTH_FROM T_MTH_TO MTH_DIFF CUR_MTH MTH_OFFSET;
      %let T_MTH_FROM = %sysfunc(inputn(&MTH_FROM,yymmn.));
      %let T_MTH_TO   = %sysfunc(inputn(&MTH_TO,yymmn.));
      %let MTH_DIFF   = %sysfunc(intck(month,&T_MTH_FROM,&T_MTH_TO));
    
      %do MTH_OFFSET = 0 %to &MTH_DIFF;
        %let CUR_MTH = %sysfunc(intnx(month,&T_MTH_FROM,&MTH_OFFSET), yymmn4.);
        %put CUR_MTH = &CUR_MTH;
      %end;
    %mend;
    
    %month_loop(1001,1607);
    
  • 0

    跟随你的逻辑有点难,但看起来你只想做:

    data final;
      set appd.file work01-work03 ;
    run;
    

相关问题