[繁体中文]             |

赛壶网

头部广告

SAS数据集多行合并为1行,以及文本还原为多行

[复制链接]
分享奖励排行榜
发表于 2019-12-30 16:03:44 | 显示全部楼层 |阅读模式
本帖最后由 daijp73 于 2019-12-30 16:14 编辑

sas数据集合并代码:

  1. /*
  2. 功能说明:SAS 数据集多行合并为1行输出。
  3. 功能调用:%nline(sds=,tds=,n=); 入口在文档尾部。
  4. 输出还原:还原方法参考 <a href="https://www.saihu.com/thread-2495-1-1.html">https://www.saihu.com/thread-2495-1-1.html</a>
  5. 联系:建议意见可联系微信号 daijp1971
  6. */

  7. /*
  8. 宏 :%renfileds(ds=,prefix=);
  9. 功能:SAS 数据集变量批量改名为 prefix + 原变量名。
  10. 参数:
  11. ds: 数据集
  12. prefix: 新变量名前缀
  13. 步骤:
  14.         获得数据集ds的所有字段。
  15.         逐一改名。
  16. 联系:建议意见可联系微信号 daijp1971
  17. */
  18. %macro renfileds(ds=,prefix=);
  19. %if %length(%sysfunc(compress("&ds.","."))) ne %length(%sysfunc(compress("&ds.","")))
  20. %then
  21.         %do;
  22.         %let libname=%scan("&ds.",1,".");
  23.         %let memname=%scan("&ds.",2,".");
  24.         %end;
  25. %else
  26.         %do;
  27.         %let libname=WORK;
  28.         %let memname=&ds.;
  29.         %end;

  30. proc sql noprint;
  31. select name into :fieldnames separated by ' '
  32. from dictionary.columns where libname=upcase("&libname") and memname=upcase("&memname") order by varnum;
  33. quit;

  34. data &ds;
  35. set &ds;
  36. %local i;
  37. %let i=1;
  38. %do %until (%scan(&fieldnames.,&i.," ")=);
  39. %let oldname=%sysfunc(compress(%scan("&fieldnames",&i," ")));
  40. rename &oldname=&prefix.&oldname;
  41. %let i=%eval(&i.+1);
  42. %end;
  43. run;
  44. %mend;

  45. /*
  46. 宏:%nline(sds=,tds=,n=);
  47. 功能:SAS 数据集多行合并为1行输出。
  48. 参数:
  49. sds: 源数据集
  50. tds: 目标数据集
  51. n: n行合并为1行
  52. 步骤:
  53.         将sds切分为n个临时表
  54.         将n个临时表合并为tds
  55. 注意:
  56.         过程中需要建立和删除n个临时表 XXX0 XXX1...XXXn-1 ,XXX可定义
  57. 联系:建议意见可联系微信号 daijp1971
  58. */
  59. %let XXX=T;
  60. %macro nline(sds=,tds=,n=);
  61. %local i;
  62. %do i=0 %to &n-1;
  63.         data &XXX._&i;
  64.         set &sds;
  65.         if mod(_n_,&n)=&i;
  66.         run;
  67. %end;

  68. %do i=0 %to &n-1;
  69.         %renfileds(ds=&XXX._&i,prefix=&XXX.&i);
  70. %end;

  71. data &tds;
  72. merge %do i=1 %to &n-1; &XXX._&i %end; &XXX._0;
  73. run;

  74. proc datasets nolist;
  75. %do i=0 %to &n-1;
  76.         %put "#### delete: &XXX._&i";
  77.         delete &XXX._&i;
  78. %end;
  79. run;
  80. %mend;

  81. /* ---------------------------------功能调用点------------------------------- */
  82. %nline( sds=mapsgfk.us_counties, tds=tb, n=10 );
复制代码


合并数据集,导出文本文件后,可以使用 gawk 工具执行如下脚本,将1行格式还原为多行格式。awk脚本如下:

  1. {
  2.         if (NR==1) { fieldwidth=int(NF/n); }       
  3.         for (i=1;i<=NF;i++)
  4.         {
  5.                 printf "%s",$i > tofile ;
  6.                 if (i%fieldwidth==0) { printf "\n" > tofile ; } else { printf "%s",FS  > tofile; }
  7.         }
  8. }
复制代码
gawk调用方式:
  1. gawk -f 1line.awk -v n=4 -v tofile=out.txt -v FS=',' s1.dat
复制代码

附件包含所有源代码,以及gawk工具。如有意见建议微信 daijp1971。

1line.zip

472 Bytes, 下载次数: 896

gawk.zip

216.43 KB, 下载次数: 903

nline.zip

1.1 KB, 下载次数: 909

有人访问你的分享时,你将获得奖励(每次1金钱,重复访问不计)

评论

使用道具 举报

使用高级回帖 (可批量传图、插入视频等)快速回复

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
快速回复 返回顶部 返回列表