SAS-自动拆分库中的所有数据集时出错

时间:2016-10-25 15:37:55

标签: loops error-handling split macros sas

我在“DATA”库中有大约100个数据集。我使用以下代码来拆分库中的所有数据集。

  1. 首先,我使用proc sql将所有数据集放入表中并对其进行编号。
  2. 其次,我还使用proc sql来读取每个数据集中的内容,以便设置拆分规则。更具体地说,拆分过程基于两个变量:date_l_和_ric。显然,date_l_是一个日期变量。而_ric是一个识别股票名称的变量。此步骤的结果如下所示:
  3. enter image description here

    1. 最后,我使用%do j=1 %to &obs.拆分数据集。
    2. 但是,我遇到了如下错误: enter image description here

      我找不到这个问题的来源,因为我没有将任何数据集命名为WORK.SET

      %macro split(sourcelib=,from=,going=);
      proc sql noprint;  /*read datasets in a library*/
        create table mytables as
        select *
        from dictionary.tables
        where libname = &sourcelib
        order by memname ;
      
        select count(memname) 
        into:numb 
        from mytables;
      
        %let numb=&numb.;
      
        select memname
        into : memname1-:memname&numb.
        from mytables;
      quit;
      
        %do i=1 %to &numb.;
          proc sql noprint;
           create table tmp&i as
           select distinct date_l_, _ric
           from &from.&&memname&i;
      
           select count(*)
           into :obs
           from work.tmp&i;
      
           %let obs=&obs.;
      
           select date_l_, _ric, catx("_", substr(_ric, 1, 13), date_l_)
           into :date_l_1-:date_l_&obs., :ric1-:ric&obs., :setname1-:setname&obs.
           from work.tmp&i;
          quit;
         %end;
          data 
          %do j = 1 %to &obs.;
             &going.&&setname&j
          %end;
            ;
          %do i=1 %to &numb.;
            set &from.&&memname&i
          %end;
            ;/*may invoking i to numb.*/
            select;
          %do j = 1 %to &obs.;
            when(_ric = "&&ric&j" and date_l_ = &&date_l_&j) output  &going.&&setname&j;
          %end;
      end;
      %mend;
      
      %split(sourcelib='AXP',from=AXP.,going=AXP.)
      

1 个答案:

答案 0 :(得分:0)

您需要i

的新循环
data 
%do i = 1 %to &obs.;   /*set rules for separated dataset*/
  &&setname&i
%end;
  ;
  set &source.&&memname&i;/*I assume this part as the core problem*/

当您尝试解析该值时,您没有为i循环。因此i的上一个循环中的最后一个值+ 1(i=1 to &obs)。

我假设你真的希望在上面的循环(i=1 to &numb)中有数据步骤。在这种情况下,请将&obs上的循环更改为使用i以外的其他内容(可能是j?)。