簡體   English   中英

SAS%DO循環以檢索多個數據集

[英]SAS %DO Loop to retrieve multiple Datasets

我正在嘗試使用%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個字符。 您可能有不平衡的引號。

我以前從未收到過此錯誤,我也不完全知道這意味着什么。 我正在嘗試創建此宏來添加今年的一些文件,但理想情況下,它會跨越多年。 即更改mtro16&i。 去地鐵&i。 除非我不想顯式地編碼%DO i=1601 %TO 1612 %BY 1 ,因為我每年都必須對其進行更改,例如,如果我從2010年開始,則必須編碼2010,然后直到2011年為止,都是針對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如何治療這種%IF疾病? 它告訴我變量i = 1013%IF條件i=1013為FALSE? 為什么這不是TRUE?

這是進行這種循環的一種方法:

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

我認為在處理日期時,應始終實際使用日期值,而不要嘗試通過使用年或月或其他類似的“快捷方式”來縮短日期。 以我的經驗,這些總是會導致代碼混亂或錯誤。

下面的宏顯示了如何傳遞開始日期和結束日期(甚至不必是每月的1號),它將返回適當的每月名稱。 然后,您可以根據需要proc append進行修改以使其與proc append或其他代碼一起使用。

實際上,它需要2個日期值作為參數。 然后,它使用%do %while循環和intnx()函數一次從開始日期到結束日期循環1個月。 我使用%sysfunc(sum(),yymmn4.)為您的每月數據集計算所需的格式,並將其打印到日志中。

碼:

%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()函數很方便,因為它使數值保持不變。

輸出:

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

遵循您的邏輯有些困難,但是看起來您只想這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM