- /*批量输出命名规则的数据集*/
- data stock;
- retain code close date;
- informat date yymmdd10.;
- input code close date;
- format date yymmdd10. code z6.;
- cards;
- 000001 10.2 2016-01-02
- 000001 10.3 2016-01-03
- 000001 10.7 2016-01-04
- 000002 9.2 2016-01-02
- 000002 9.3 2016-01-03
- 000002 9.7 2016-01-04
- 000004 8.2 2016-01-02
- 000004 8.3 2016-01-03
- 000004 8.7 2016-01-04
- ;
- /*如何通过编程把各自股票代码指定观测输出到各自的数据集中,
- 最好比如以字母a开头,以股指代码为后缀形成数据集命名。
- 例如上述数据集内容就要形成数据a000001、a000002、a000004。*/
- /*解决方案一*/
- proc sql noprint;
- select count(distinct code)
- Into :N
- from stock;
- select distinct code
- into :code1-:code%left(&N)
- from stock;
- quit;
- %macro split;
- %do i=1 %to &N;
- data a&&code&i;
- set stock;
- if code="&&code&i" then output a&&code&i;
- run;
- proc export data=a&&code&i outfile = "D:\a&&code&i...csv"
- dbms=csv replace;
- putnames=yes;
- run;
- %end;
- %mend split;
- %split
- /*附上其他大神的解决方案*/
- /*解决方案二*/
- proc sql;
- select distinct code into:key separated by ' '
- from stock;
- quit;
- %macro dist;
- %do i=1 %to %sysfunc(countw(&key));
- %let hat=%scan(&key,&i);
- data a&hat;
- set stock;
- where code="&hat";
- run;
- proc export outfile="D:\a&hat..csv" dbms=csv replace;
- /*optional: export all these files */
- run;
- %end;
- %mend;
- %dist
- /*解决方案三*/
- proc sort data=stock;by code;run;
- data stock1;set stock;by code;if first.code then num+1;run;
- proc sql noprint;
- select max(num) into:num from stock1;
- quit;
- %macro exportfile(ds,n);
- %do i=1 %to &n;
- data a&i (drop=num);
- set &ds;
- where num=&i;
- run;
- proc sql noprint;
- select distinct(code) into :filename from a&i;
- quit;
- %put &filename;
- proc export data=a&i dbms=csv replace outfile="d:\a&filename..csv";
- run;
- %end;
- %mend exportfile;
- %exportfile(stock1,&num);
- /*解决方案四*/
- proc sql;
- create table list as
- select distinct code from stock;
- quit;
- data _null_;
- set list;
- call execute('data a'||strip(code)||';
- set stock;
- where code='||quote(strip(code))||';
- run;');
- run;