楼主: playmore
1565 2

[SAS] SAS基础宏之3:ChkDataSet [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2015-3-7 19:51:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
这个宏就简单了,输入一个或多个数据集,输出1或0,分别表示该数据集是否存在

这个宏用于在其他宏中保持robust用的,如果不先确定下数据集是否存在,到时候SAS在log窗口报的错可不是那么好懂

另外,如果有更好的解决我写的宏的方法,欢迎指教

话说我很久之前吭哧吭哧写的一个标准化的宏,后来才发现有proc stdize

所以大家还要多多交流


  1. %macro ChkDataSet(DataSet,FlagDataSetExists);

  2. /**********************************************************************/
  3. /* 此宏用于检查指定的数据集是否存在。其中,DataSet是指定的数据集,若 */
  4. /* 需要指定具体的逻辑库,则采用逻辑库.数据库的格式,可设多个数据集, */
  5. /* 用空格分隔;FlagDataSetExists是标记宏变量名称,=1表示数据集存在, */
  6. /* 否则=No,若指定了多个数据集,则不同位置上的1或0代表相应的数据集是 */
  7. /* 否存在。另外需要注意,第一,当仅指定一个数据集时,若不指定逻辑库名 */
  8. /* 称,而只指定数据集名称,此时若在SAS环境中只包含一个指定的数据集, */
  9. /* 则标记宏变量FlagDataSetExists=1,若包含多个同名的数据集,则会报错;*/
  10. /* 第二,当指定多个数据集时,若不指定逻辑库名称,则默认为WORK逻辑库。 */
  11. /* */
  12. /* 最终得到的是宏变量&FlagDataSetExists,若指定数据集存在,则有 */
  13. /* &FlagDataSetExists=1,否则=0,若为多个数据集,则不同位置上的1或0代 */
  14. /* 表相应的数据集是否存在。 */
  15. /* */
  16. /* Created on 2012.11.16 */
  17. /* Modified on 2012.11.16 */
  18. /**********************************************************************/

  19. /* 检查DataSet的存在性 */
  20. %if &DataSet EQ %STR( ) %then %do;
  21. %put ERROR: The DataSet should not be blank, please check it again.;
  22. %goto exit;
  23. %end;

  24. /* 开始进行计算 */
  25. %global &FlagDataSetExists;

  26. /* 情形一:仅设定一个数据集,此时若省略逻辑库名,则在所有逻辑库中查找同名的数据集并予以报告 */
  27. %if %SYSFUNC(FIND(&DataSet,%STR( ))) EQ 0 %then %do;
  28. /* 检查DataSet的合法性 */
  29. %if %SYSFUNC(FIND(&DataSet,.)) NE 0 %then %do;
  30. %let CDS_LibName=%UPCASE(%SCAN(&DataSet,1,.));
  31. %let CDS_DataSet=%UPCASE(%SCAN(&DataSet,2,.));
  32. %end;
  33. %else %do;
  34. %let CDS_LibName=%STR();
  35. %let CDS_DataSet=%UPCASE(&DataSet);
  36. %end;

  37. %if &CDS_DataSet EQ %STR() %then %do;
  38. %put ERROR: The DataSet should not be blank, please check it again.;
  39. %goto exit;
  40. %end;
  41. %else %if &CDS_LibName NE %STR() %then %do;
  42. %let &FlagDataSetExists=%SYSFUNC(EXIST(&CDS_LibName..&CDS_DataSet.));
  43. %end;
  44. %else %do;
  45. proc sql noprint;
  46. create table CDS_temp as
  47. select * from sashelp.vtable
  48. where memname="&CDS_DataSet";
  49. quit;

  50. proc sql noprint;
  51. select count(*) into :CDS_DataSetNum from CDS_temp;
  52. quit;

  53. %if &CDS_DataSetNum EQ 0 %then %let &FlagDataSetExists=0;
  54. %else %if &CDS_DataSetNum EQ 1 %then %let &FlagDataSetExists=1;
  55. %else %do;
  56. %put ERROR: There could be more than one DataSets with the same name appointed in different libraries, please reassign a LibName first.;
  57. %goto exit;
  58. %end;
  59. %end;
  60. %end;
  61. /* 情形二:设定多个数据集,此时若省略逻辑库名,则默认为WORK逻辑库 */
  62. %else %do;
  63. %SeparateString(InputString=&DataSet,OutputString=CDS_DateSet);

  64. %do CDS_i=1 %to &CDS_DateSet_Num;
  65. /* 检查DataSet的合法性 */
  66. %if %SYSFUNC(FIND(&&CDS_DateSet_Var&CDS_i,.)) NE 0 %then %do;
  67. %let CDS_LibName_&CDS_i.=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,1,.));
  68. %let CDS_DataSet_&CDS_i=%UPCASE(%SCAN(&&CDS_DateSet_Var&CDS_i,2,.));
  69. %end;
  70. %else %do;
  71. %let CDS_LibName_&CDS_i.=WORK;
  72. %let CDS_DataSet_&CDS_i.=%UPCASE(&&CDS_DateSet_Var&CDS_i);
  73. %end;

  74. %let CDS_FlagDataSetExists_&CDS_i.=%SYSFUNC(EXIST(&&CDS_LibName_&CDS_i...&&CDS_DataSet_&CDS_i.));
  75. %end;

  76. %let &FlagDataSetExists=&&CDS_FlagDataSetExists_1;

  77. %do CDS_j=2 %to &CDS_DateSet_Num;
  78. %let &FlagDataSetExists=&&&FlagDataSetExists.&&CDS_FlagDataSetExists_&CDS_j;
  79. %end;
  80. %end;

  81. /* 如果想要输出结果,请取消下面的注释 */
  82. /*%put &&&FlagDataSetExists;*/

  83. /* 删除不必要的表格 */
  84. proc datasets lib=work nolist;
  85. delete CDS_temp;
  86. quit;


  87. %exit:
  88. %mend;


  89. %macro Demo();

  90. %let DataSet=Gfl_fundcodelist_mgrname Gfl_managersoffund; /* 数据集名称,可设为多个,用空格分隔 */
  91. %let FlagDataSetExists=FlagDataSetExists1; /* 宏变量的名称,注意不能与参数名称相同*/
  92. %ChkDataSet(&DataSet,&FlagDataSetExists);

  93. %put &FlagDataSetExists1;

  94. %mend;
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:dataset sas基础 DataS Data 基础宏 基础 基础宏 ChkDataSet SAS

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
xddlovejiao1314 + 100 + 100 + 3 + 3 + 3 精彩帖子
niuniuyiwan + 60 + 60 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 160  论坛币 + 160  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
xddlovejiao1314 学生认证  发表于 2015-10-13 08:41:35
谢谢分享。
已有 1 人评分论坛币 热心指数 收起 理由
niuniuyiwan + 10 + 1 精彩帖子

总评分: 论坛币 + 10  热心指数 + 1   查看全部评分

藤椅
wangyong8935 在职认证  发表于 2019-10-15 20:19:11

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-9 10:46