| 
 | 
	
 
 本帖最后由 daijp73 于 2019-12-30 16:14 编辑  
 
sas数据集合并代码: 
 
- /*
 
 - 功能说明:SAS 数据集多行合并为1行输出。
 
 - 功能调用:%nline(sds=,tds=,n=); 入口在文档尾部。
 
 - 输出还原:还原方法参考 <a href="https://www.saihu.com/thread-2495-1-1.html">https://www.saihu.com/thread-2495-1-1.html</a>
 
 - 联系:建议意见可联系微信号 daijp1971
 
 - */
 
  
- /*
 
 - 宏 :%renfileds(ds=,prefix=);
 
 - 功能:SAS 数据集变量批量改名为 prefix + 原变量名。
 
 - 参数:
 
 - ds: 数据集
 
 - prefix: 新变量名前缀
 
 - 步骤:
 
 -         获得数据集ds的所有字段。
 
 -         逐一改名。
 
 - 联系:建议意见可联系微信号 daijp1971
 
 - */
 
 - %macro renfileds(ds=,prefix=);
 
 - %if %length(%sysfunc(compress("&ds.","."))) ne %length(%sysfunc(compress("&ds.",""))) 
 
 - %then
 
 -         %do;
 
 -         %let libname=%scan("&ds.",1,".");
 
 -         %let memname=%scan("&ds.",2,".");
 
 -         %end;
 
 - %else 
 
 -         %do;
 
 -         %let libname=WORK;
 
 -         %let memname=&ds.;
 
 -         %end;
 
  
- proc sql noprint;
 
 - select name into :fieldnames separated by ' '
 
 -  from dictionary.columns where libname=upcase("&libname") and memname=upcase("&memname") order by varnum;
 
 - quit;
 
  
- data &ds;
 
 - set &ds;
 
 - %local i;
 
 - %let i=1;
 
 - %do %until (%scan(&fieldnames.,&i.," ")=);
 
 -  %let oldname=%sysfunc(compress(%scan("&fieldnames",&i," ")));
 
 -  rename &oldname=&prefix.&oldname;
 
 -  %let i=%eval(&i.+1);
 
 - %end;
 
 - run;
 
 - %mend;
 
  
- /*
 
 - 宏:%nline(sds=,tds=,n=);
 
 - 功能:SAS 数据集多行合并为1行输出。
 
 - 参数:
 
 - sds: 源数据集
 
 - tds: 目标数据集
 
 - n: n行合并为1行
 
 - 步骤:
 
 -         将sds切分为n个临时表
 
 -         将n个临时表合并为tds
 
 - 注意:
 
 -         过程中需要建立和删除n个临时表 XXX0 XXX1...XXXn-1 ,XXX可定义
 
 - 联系:建议意见可联系微信号 daijp1971
 
 - */
 
 - %let XXX=T;
 
 - %macro nline(sds=,tds=,n=);
 
 - %local i;
 
 - %do i=0 %to &n-1;
 
 -         data &XXX._&i;
 
 -         set &sds;
 
 -         if mod(_n_,&n)=&i;
 
 -         run;
 
 - %end;
 
  
- %do i=0 %to &n-1;
 
 -         %renfileds(ds=&XXX._&i,prefix=&XXX.&i);
 
 - %end;
 
  
- data &tds;
 
 - merge %do i=1 %to &n-1; &XXX._&i %end; &XXX._0;
 
 - run;
 
  
- proc datasets nolist;
 
 - %do i=0 %to &n-1; 
 
 -         %put "#### delete: &XXX._&i";
 
 -         delete &XXX._&i;
 
 - %end;
 
 - run;
 
 - %mend;
 
  
- /* ---------------------------------功能调用点------------------------------- */
 
 - %nline( sds=mapsgfk.us_counties, tds=tb, n=10 );
 
  复制代码 
 
  合并数据集,导出文本文件后,可以使用 gawk 工具执行如下脚本,将1行格式还原为多行格式。awk脚本如下: 
 
- {
 
 -         if (NR==1) { fieldwidth=int(NF/n); }        
 
 -         for (i=1;i<=NF;i++)
 
 -         {
 
 -                 printf "%s",$i > tofile ;
 
 -                 if (i%fieldwidth==0) { printf "\n" > tofile ; } else { printf "%s",FS  > tofile; }
 
 -         }
 
 - }
 
 
  复制代码 gawk调用方式: 
- gawk -f 1line.awk -v n=4 -v tofile=out.txt -v FS=',' s1.dat
 
 
  复制代码 
附件包含所有源代码,以及gawk工具。如有意见建议微信 daijp1971。 
 
 |   
		
 
				
				
					
					有人访问你的分享时,你将获得奖励(每次1金钱,重复访问不计) 
				 
				
				
				
				
				 
 
 |