我在“DATA”库中有大约100个数据集。我使用以下代码来拆分库中的所有数据集。
proc sql
将所有数据集放入表中并对其进行编号。proc sql
来读取每个数据集中的内容,以便设置拆分规则。更具体地说,拆分过程基于两个变量:date_l_和_ric。显然,date_l_是一个日期变量。而_ric是一个识别股票名称的变量。此步骤的结果如下所示:。
%do j=1 %to &obs.
拆分数据集。我找不到这个问题的来源,因为我没有将任何数据集命名为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.)
答案 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
?)。