- 阅读权限
- 255
- 威望
- 1 级
- 论坛币
- 7113 个
- 通用积分
- 499.0346
- 学术水平
- 217 点
- 热心指数
- 220 点
- 信用等级
- 136 点
- 经验
- 15006 点
- 帖子
- 251
- 精华
- 1
- 在线时间
- 1698 小时
- 注册时间
- 2005-6-21
- 最后登录
- 2023-12-19
|
- %macro test(indslist=,outds=);
- %local dslist1 dslist2 nomatchvar;
- data _cntlin;
- length start $50;
- retain fmtname 'dsid' type 'i';
- %let num=1;
- %let dsname=%scan(&indslist,&num,%str( ));
- %do %while(&dsname ne);
- %if %sysfunc(exist(&dsname))=0 %then %put ERROR-&dsname does not exist.;
- %if %index(&dsname,%str(.))=0 %then %let dsname=work.&dsname;
- %let dslist1=&dslist1 %upcase("&dsname");
- %let dslist2=&dslist2 &dsname;
- start=%upcase("&dsname");
- label=#
- output;
- %let num=%eval(&num+1);
- %let dsname=%scan(&indslist,&num,%str( ));
- %end;
- run;
- proc format cntlin=_cntlin; run;
- proc sql noprint;
- drop table _cntlin;
- create table __temp as
- select upcase(name) as name, type, length,
- input(catx('.',input(catx('.',libname,memname),dsid.),varnum),best.) as varid
- from dictionary.columns
- where catx('.',libname,memname) in(&dslist1)
- order by name;
- select a.name into :nomatchvar separated by ','
- from __temp(where=(type='char')) as a, __temp(where=(type='num')) as b
- where a.name=b.name;
- quit;
- %if &nomatchvar ne %then %do;
- %put ERROR-***Variable &nomatchvar has been defined as both character and numeric.***;
- %goto exit;
- %end;
- data __temp;
- maxlength=0; minvarnum=999;
- do _n_=1 by 1 until(last.name);
- set __temp;
- by name;
- maxlength=max(maxlength,length);
- minvarnum=min(minvarnum,varid);
- end;
- keep name type maxlength minvarnum;
- run;
- proc sort data=__temp out=__temp;
- by minvarnum;
- run;
- data &outds;
- %let dsid=%sysfunc(open(__temp,i));
- %let num=%sysfunc(attrn(&dsid,nlobs));
- %if &num gt 0 %then %do;
- %syscall set(dsid);
- length
- %do i=1 %to #
- %let rc=%sysfunc(fetchobs(&dsid,&i));
- &name %if &type=char %then %str($); &maxlength
- %end;;
- %end;
- %let rc=%sysfunc(close(&dsid));
- set &dslist2;
- format _all_;
- informat _all_;
- run;
- proc delete data=__temp; run;
- %exit:
- proc catalog catalog=work.formats;
- delete dsid.infmt;
- quit;
- %mend test;
- data a;
- input x $ y;
- datalines;
- aaa 1
- bbb 2
- ;
- data b;
- length x $20;
- input x y z $;
- datalines;
- aaaaa 1 aa
- bbb 2 b
- ;
- %test(indslist=a b,outds=z)
复制代码
|
|