专栏首页SAS程序分享号号号SAS-一个小程序实现自动插入空白行~

SAS-一个小程序实现自动插入空白行~

前几天一个朋友问我如何快速的在数据集中指定位置插入空白记录。当时我也是愣了一下,以前实现输出制作排版都是在proc report输出时进行设置的,还真没在数据集中的指定位置添加空白行(proc report通过out=也可以实现,感觉又写麻烦)。所以呀,小编就写了一个小程序,来实现数据集中指定位置添加空白行!虽然程序的功能很单一,但是同样小编认为是这也是一个很有趣的程序,所以啊,小编就给大家分享一下下~

原始需求

在贴代码前,先来看看最原始的需求,最开始需求是这样的,想要在数据集某变量分组后面插入空白行!于是小编就做了一个简易的测试集!

data test1;
do group=1 to 4;
  do i=1 to 3;
    output;
  end;
end;
run;

小程序原理

小编一贯认为不管写大型的程序还是小型的程序,写程序的思路和原理永远是最重要的,只要有思路了,实现起来就非常简单了。小编是这样想的,先排序,然后就利用last.group与output语句来实现添加空白记录!不理解就看代码!

程序已写好,复制即可用~

/*************************************************************************************************************************
宏名称    : addline

目的      : 给数据集添加空白记录

参数说明    :  

inds      输入数据集
ouds      输出数据集
keyord    排序分组变量
blanknum  插入空白行数(默认:1)  
实例      :;   ;
________________________________________________________________________________________________________________________

__________________________________________________________________________________________________________________________
版本     日期           修改人             修改描述
---     -----------    ------------     ----------------------------------------------------------------------------------
1.0     2018.05.11      setup           创建
****************************************************************************************************************************************/


%macro addline(inds=,outds=,keyord=,blanknum=1);

%local libname memname;
%if &inds.= %then %do;
   %put NOTE:plesce check your dataset name;
   %goto exit;
%end;
%if %length(%sysfunc(compress("&inds.","."))) ne %length(%sysfunc(compress("&inds.",""))) %then %do;
   %let libname=%scan("&inds.",1,".");
   %let memname=%scan("&inds.",2,".");
%end;
%else %do;
   %let libname=WORK;
   %let memname=&inds.;
%end;
proc sql noprint;
select distinct NAME into:varlist separated  by "," from dictionary.columns where libname=upcase("&libname.") and memname=upcase("&memname.");
quit;

data &outds.;
  set &inds.;
  sys_ord=_N_;
run;
proc sort data=&outds.  out=&outds.  sortseq=linguistic(numeric_collation=on);by &keyord.   sys_ord;quit;
data &outds.;
  set &outds. end=last;
  by &keyord.   sys_ord;
  if ^missing(&keyord.) then output &outds.;
  if last.&keyord.  and not last then do;
     do _snum=1 to &blanknum.;
       call missing(&varlist.);
       output &outds.;
     end;
  end;
  drop  _snum  sys_ord;
run;
%exit:
%mend;

宏怎么使用,见代码中的参数说明!下面还是来测试一下宏并看下结果。

%addline(inds=test1,outds=test2,keyord=group,blanknum=2);

这个小程序算是写完了,至于加空白行到底要干嘛,其实不重要!重要的是思路,是语句~不过突然临时起意,突破分组限制,在指定行号后面添加空白行!

/*************************************************************************************************************************
宏名称    : addline2

目的      : 给数据集添加空白记录

参数说明    :  

inds      输入数据集
ouds      输出数据集
line      指定行号后面添加空白行
实例:%addline2(inds=test1,outds=test2,line=%str(2 5 8))  ;
________________________________________________________________________________________________________________________

__________________________________________________________________________________________________________________________
版本     日期           修改人             修改描述
---     -----------    ------------     ----------------------------------------------------------------------------------
1.0     2018.05.11      setup           创建
****************************************************************************************************************************************/


%macro addline2(inds=,outds=,line=);

%local libname memname;
%if &inds.= %then %do;
   %put NOTE:plesce check your dataset name;
   %goto exit;
%end;
%if %length(%sysfunc(compress("&inds.","."))) ne %length(%sysfunc(compress("&inds.",""))) %then %do;
   %let libname=%scan("&inds.",1,".");
   %let memname=%scan("&inds.",2,".");
%end;
%else %do;
   %let libname=WORK;
   %let memname=&inds.;
%end;
proc sql noprint;
select distinct NAME into:varlist separated  by "," from dictionary.columns where libname=upcase("&libname.") and memname=upcase("&memname.");
quit;

data &outds.;
  set &inds.;
  output &outds.;
  if _N_ IN (&line.) then do;
  call missing(&varlist.);
  output  &outds.;
  end;
run;

%exit:
%mend;

也还是看看效果~

%addline2(inds=test1,outds=test2,line=%str(2 5 8));

今天就这么多了,后续内容,敬请期待~

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn),作者:Setup~

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Macro-csv2sas(可控制变量Length)

    %macro csv_csv2sas(path=,csvname=,colmax=%str(10000),outds=,encoding=gb2312,varr...

    Setup
  • Macro-frq_missing

    %frq_missing(inds=如何需要check的数据集,outds=缺失结果输出的数据集,sasver=SAS语言的版本/CN 或EN);

    Setup
  • SAS-编程中的小技巧(九)

    新年的第一篇推文,一直打算写一点什么,小编辗转反侧、思来想去,发现编程中的小技巧已经写了八篇,如果在写一篇,那便是第九篇,与2019年的9有遥相呼应之势!好像做...

    Setup
  • 2018程序员必备碎片化学习工具

    码个蛋第239次推文 ? 2017马上就要过去了,2018来了。 工作、生活节奏超快的今天,想要不断提升自我,碎片化阅读学习是你最佳的选择,如果你有一颗学习的心...

    企鹅号小编
  • Docker 引擎 - 发布渠道

    Docker 引擎具有下面 3 个更新渠道: stable, test 和 nightly:

    HoneyMoose
  • 嵌入式链接脚本(LINK SCRIPT)介绍

    每一个链接过程都由链接脚本(linkerscript, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内...

    心跳包
  • Excel公式技巧27: 在条件格式中使用公式来突出显示单元格

    条件格式与公式相配合,往往能够发挥很大的威力,其中之一就是用来突出显示单元格。如下图1所示,在“新建格式规则”对话框中:

    fanjy
  • 苹果打算自主设计电源管理芯片,续航能力有望得到提高 | 热点

    镁客网
  • Vue路由

    Vue作为单页面应用的框架,路由是必不可少的。现在也很多引入vuejs去使用,今天只说脚手架创建的项目的路由。

    wade
  • 深入讲解 Vue 中实现原理

    随着 Vue2.0 的发布,前端入门的要求也越来越低,已至于 Vue 已经成为一个前端的标配,最近也面了很多前端开发工程师,发现大部分都停留在用的阶段上,建议大...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券