Loops SAS嵌套循环语法

Loops SAS嵌套循环语法,loops,sas,Loops,Sas,我有一个SAS代码,可以很好地读取数据集并合并它们。数据集是根据数据的季度和年份命名的,例如:“data1_Q11999”和“data2_Q11999”。下面是我用来做这件事的代码 现在,我想通过将1999年增加到2014年,将季度从1增加到4(即两个循环),对其中几个数据集进行循环 我的理解是,我需要创建一个宏来实现这一点,但我在语法方面遇到了一些问题 代码如下。我试图用do循环将代码包装在%macro语句中,但不断出现大量语法错误。有没有一种直接的方法来实现这一点 data origfile

我有一个SAS代码,可以很好地读取数据集并合并它们。数据集是根据数据的季度和年份命名的,例如:
“data1_Q11999”
“data2_Q11999”
。下面是我用来做这件事的代码

现在,我想通过将1999年增加到2014年,将季度从1增加到4(即两个循环),对其中几个数据集进行循环

我的理解是,我需要创建一个宏来实现这一点,但我在语法方面遇到了一些问题

代码如下。我试图用
do循环
将代码包装在
%macro
语句中,但不断出现大量语法错误。有没有一种直接的方法来实现这一点

data origfile;
infile "D:/data1_Q11999.txt" dlm= '|' MISSOVER DSD lrecl=32767 firstobs=1 ;
input
fico : 8.
dt_first_pi : 8.
id : $16.
run;


data svcgfile;
infile "D:/data2_Q11999.txt" dlm= '|' MISSOVER DSD lrecl=32767 firstobs=1 ;
input
id : $12.
Period : 8.
actual_loss : 12.
;
run;


PROC SORT DATA=origfile OUT=origfile; 
  BY id; 
RUN; 

PROC SORT DATA=svcgfile OUT=svcgfile; 
  BY id; 
RUN; 

DATA mergedata; 
  MERGE origfile svcgfile;
  BY id; 
RUN; 

假设您想为year quarter生成一个单独的合并文件,您可以使用这样的宏

%macro read(first_yr,last_yr);
%local year qtr;
%do year=&first_yr %to &last_yr ;
%do qtr=1 %to 4 ;
data data1;
  infile "D:\data1_Q&qtr.&year..txt" dsd dlm= '|' truncover ;
  length id $16 fico dt_first_pi 8 ;
  input fico dt_first_pi id ;
run;
proc sort data=data1; by id; run;

data data2;
  infile "D:\data2_Q&qtr.&year..txt" dsd dlm= '|' truncover ;
  length id $16 period actual_loss 8 ;
  input id period actual_loss ;
run;
proc sort data=data2; by id; run;

data result_q&qtr.&year. ;
  merge data1 data2 ;
  by id;
run;
%end;
%end;
%mend read ;
然后您可以这样调用它来生成64个独立的数据集

%read(1999,2014)
但您可能真的希望将这64个数据集合并为一个数据集,以便在接下来的步骤中更轻松地使用它。您可能会修复读取数据以一次生成所有数据的过程,但这里有一个简单的数据步骤,可以将以
RESULT\uuuu
开头的任何数据集(如上面生成的宏)合并为一个数据集

data want ;
  length year qtr 8 dsname $41 ;
  set result_: indsname=dsname ;
  year = input(substr(scan(dsname,-1,'.'),9),4.);
  qtr  = input(substr(scan(dsname,-1,'.'),8),1.);
run;

如果所有季度和年份的所有DATA1文件都具有相同的字段布局,则可以使用通配符文件引用通过一个数据步骤读取所有文件。当然,DATA2文件也是如此。那么就不需要循环宏等了。我不确定我是否明白你的意思。我不需要一次读完它们。也不会跨年度/季度合并。只需要任何一个季度/年度组合来合并文件。你能展示一下你的尝试以及它们为什么不起作用吗?还有,为什么要将数据保存在单独的文件中,而不是将所有季度都放在一个数据集中?您可以添加变量来指示特定记录所代表的时间段。您可能需要考虑将所有orig和svg文件读入两个文件,然后立即合并。在一个进程中至少减少代码,然后减少所有文件。不这样做的唯一原因是如果数据集太大,在我看来,如果最终的合并数据集将超过2000-3000万行,这正是我想要的。非常感谢。