使用sas将文件附加到宏中

时间:2018-07-16 16:08:30

标签: sas-macro

实际上,我才刚刚开始学习SAS,但在宏观方面我并不那么出色。我正在处理每天都分为不同部分的大数据。但是最后我必须将它们作为一天添加。我使用的代码是-

  options nosource fullstimer cpucount=2;

  options nonumber nodate nocenter source mprint FMTSEARCH=(iu) ls=180 ;

  options errors=2;
  dm 'clear list'; dm 'clear log';
  libname taq 'G:\cq2011';
  libname mytaq 'G:\taqsas11';
  libname iu 'G:\program\iustructure';
  libname ct 'G:\ct2011';
  libname ctq2 'G:\ctq2011';
  libname no 'G:\nbbo2011';

  option msglevel=i mprint source nodate nonumber replace fullstimer notes;
  %let iupath=F:\program\iustructure;

  data _null_; time=time(); put time=; format time time11.2; run;

  %let me1=A; %let me2=B; %let me3=C; %let me4=D; %let me5=J; %let me6=K; 
  %let me7=M; %let me8=N; 
  %let me9=P; %let me10=T; %let me11=W; %let me12=X; %let me13=Y; %let 
   me14=Z; 
  %let me15=I; %let me16=S; %let me17=Q; %let me18=V;


  proc printto log="G:\saslog\sas2011.txt";
  run; 


  DATA dno;
  INFILE 'G:\cq2011\cqdate2011.txt';
  INPUT dno $ 1-12;
  run;
  proc contents; 
  PROC PRINT; RUN; 
  DATA tno;
  INFILE 'G:\ct2011\ctdate2011.txt';
  INPUT tno $ 1-8;
  RUN;
  proc contents; 
  PROC PRINT; RUN; 

  %MACRO read(n);

  %DO s=1 %TO &n;

  DATA _null_;
      SET dno;
        IF _n_ =&s THEN DO; 
              CALL SYMPUT('dfile', dno);

      END;
  RUN;
  DATA _null_1;
      SET tno;
        IF _n_ =&s THEN DO; 
              CALL SYMPUT('tfile', tno);
      END;
  RUN;


    %let extract=%substr(&dfile,1,8);
    %let extra=%substr(&tfile,1,8);

   %let mon=%substr(&dfile,6,1);
   data nbbotmp(keep=symbol TIME bestbid bestofr totbdp totodp);
   set taq.cq_&dfile;
   by symbol time;
   array exBid(18); array exOfr(18); array exBidsiz(18); array exOfrsiz(18);
   retain exBid1-exBid18 exOfr1-exOfr18 exBidsiz1-exBidsiz18 exOfrsiz1- 
   exOfrsiz18 bestbid bestofr ;
   if mode in (4, 7, 9, 11, 13, 14, 15, 19, 20, 27, 28) then do; bid=0; 
   ofr=9999999; end;
    else if bid<=0 then do; bid=0; ofr=9999999; end;
    else if ofr<=0 then do; bid=0; ofr=9999999; end;
    else if bidsiz<=0 then do; bid=0; ofr=9999999; end;
    else if ofrsiz<=0 then do; bid=0; ofr=9999999; end;
    else if 0>ofr-bid then do; bid=0; ofr=9999999; end;
    else if ofr-bid>5 then do; bid=0; ofr=9999999; end;
   if first.symbol then do;
    do i=1 to 18; exBid(i)=.; exOfr(i)=.; exBidsiz(i)=0; exOfrsiz(i)=0; end;
    end;
   %do l=1 %to 18; %if &l^=1 %then else; if ex="&&me&l" then kEx=&l; %end;
   if kEx>0 then do;
    exBid(kEx) = bid; exOfr(kEx) = ofr; exBidsiz(kEx) = bidsiz; exOfrsiz(kEx) 
    = ofrsiz;
    bestbid = max(of exBid1-exBid18); bestofr = min(of exOfr1-exOfr18);
    end;
    if bestbid=0 then do; bestbid=.; bestofr=.; end; *set strange quotes to 
    be missing;
    else if bestofr=9999999 then do; bestbid=.; bestofr=.; end;
    else do;
        totbdp=0; totodp=0;
        %do l=1 %to 18;
            if exBid(&l)=bestbid then totbdp=totbdp+exbidsiz(&l);
            if exofr(&l)=bestofr then totodp=totodp+exofrsiz(&l);
        %end;
    end;
    if last.time then do; time=time+1; output; end;
   length totbdp totodp 4;
   run;


    options replace;
    data no.nbbo_&dfile (drop=lbo lbb lbod lbbd ls  compress=yes);set 
     nbbotmp; by symbol time;
     lbo=lag(bestofr); lbb=lag(bestbid); lbod=lag(totodp); lbbd=lag(totBdp); 
       ls=lag(symbol);
      if bestofr ne lbo then output;
     else if bestbid ne lbb then output;
        else if totodp ne lbod then output;
            else if totBdp ne lbbd then output;
                else if symbol ne ls then output;
        run;

    data qsymbol; length dfile $ 11;
    set no.nbbo_&dfile (keep=symbol); by symbol; 
    if first.symbol then do; dfile="&dfile"; output; end; 
    run;


      %if &s=1 %then %do; data mytaq.qsymbol2; set qsymbol; run; %end;
      %else %do; proc append base=mytaq.qsymbol2 data=qsymbol force; run; 
      %end;
     %END;

    %MEND; 
    %read(2); 

我们的数据包括整年的类型为20110101_1至20110101_n,20110102_1至20110102_m的文件。我们需要将一个日期的文件合并到一个文件中。也就是说,我们要将20110101_1附加到20110101_n到一个名为20110101_1的文件中。请注意,每个日期的子文件数会有所不同。

1 个答案:

答案 0 :(得分:0)

您的问题对我来说还不是100%清楚,但是我将其解释为:

  

如何将文件与类似的命名方案结合在一起

您可以通过多种方法执行此操作,但是有两种简单的方法。

如果您有一个文件名数据集,看起来像是(?),那么您可以编写一个append宏,如下所示:

%macro append_file(base=, data=);
  proc append base=&base. data=&data. force;
  run;
%mend append_file;

然后从具有文件名的数据集中调用它。

data _null_; *initially change this to something so you can debug it;
  merge dno tno; *it looks like a side-to-side is okay here?;
  call_str = cats('%append_file(base=',tno,',data=',dno,')');
  call execute(call_str);
run;

第二,如果文件名仅来自_1 _2 _3 _4,则可以通过相对简单的宏循环相当简单地完成此操作。

%macro dnames(n);
%do i = 1 to &n;
&prefix._&n.
%end;
%mend dnames;

data want;
  set 
    %dnames(4)
  ;
run;

您上面的循环是一个更复杂的版本,似乎将两者结合在一起。您的问题并未充分说明其他要求是什么,可能还需要其他要求,但是很可能您可以使其更接近这些方法中的一种。