楼主: webgu
4119 23

如何自动编译子文件下的SAS Macro [推广有奖]

11
webgu 发表于 2013-6-19 15:20:49 |只看作者 |坛友微信交流群
playmore 发表于 2013-6-19 15:13
名字起好的话也还行了
我有300+个宏了吧
也都放到一个文件夹下
呵呵,多谢。我试试。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

使用道具

12
pobel 在职认证  发表于 2013-6-20 09:33:21 |只看作者 |坛友微信交流群
版主可以试一下这个:

filename tmp pipe 'dir "d:\tt" /b /ad /s';
data _null_;
   infile tmp lrecl=300 truncover end=last;
   input @1 dir $100.;

   *** call FILENAME statement;
   call execute('filename mymac'||cats(_n_)||' '||quote(cats(dir))||';');
   length maclist $1000;

   *** set SASAUTOS;
   if last then do;
      do i=1 to _n_;
         maclist=catx(" ",maclist,"mymac"||cats(i));
          end;
          call execute("options mautosource sasautos=(sasautos "||cats(maclist)||");");
   end;
run;
filename tmp clear;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 100 + 100 + 5 + 5 + 5 神一样的存在
boe + 1 + 1 + 1 正解

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

和谐拯救危机

使用道具

13
webgu 发表于 2013-6-20 15:40:46 |只看作者 |坛友微信交流群
pobel 发表于 2013-6-20 09:33
版主可以试一下这个:

filename tmp pipe 'dir "d:\tt" /b /ad /s';
这个程序写得太巧妙了。

用命名管道获取子文件夹名。通过call execute语句的传递关联SAS文件名,再指定sasautos的库。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

使用道具

14
zhou.wen 发表于 2013-6-21 14:34:17 |只看作者 |坛友微信交流群
我习惯把宏存在服务器数据库中,存成text格式,需要的时侯根据id或命名取出来
这样方便做分布式运算
Practice Is The Best Teacher!

使用道具

15
zhou.wen 发表于 2013-6-21 14:39:30 |只看作者 |坛友微信交流群
唯一要注意的是sas和数据库交互的最大限度是32767 字,太长的宏就要做截断处理了
而且sas默认取数据库的字符是1000字,下面的方法可以最大化放宽这个限度
  1. proc sql;
  2. connect to oledb
  3. (provider=sqloledb DBMAX_TEXT= 32767 dsn="&sys_service" user=&sys_user password=&sys_password properties=("Initial Catalog"=&sys_database));
  4. create table &out_dt as select *from connection to oledb (&strSql);
  5. disconnect from oledb;
  6. quit;
复制代码
Practice Is The Best Teacher!

使用道具

16
zhou.wen 发表于 2013-6-21 14:45:18 |只看作者 |坛友微信交流群
顺便问一下
options mprint symbolgen mautosource sasautos=(sasautos mymacro);
这种方式编译宏是否要求宏文件名字(文件名)与宏文件中第一个宏的名字一致
比如aa.sas文件就要求,该文件中第一个宏名字为aa
%macro aa;.....
Practice Is The Best Teacher!

使用道具

17
webgu 发表于 2013-6-21 16:04:52 |只看作者 |坛友微信交流群
zhou.wen 发表于 2013-6-21 14:45
顺便问一下
options mprint symbolgen mautosource sasautos=(sasautos mymacro);
这种方式编译宏是否要求 ...
是的。且一个文件名一个宏。
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

使用道具

18
zhou.wen 发表于 2013-6-21 16:36:09 |只看作者 |坛友微信交流群
webgu 发表于 2013-6-21 16:04
是的。且一个文件名一个宏。
我实验发现一个文件可以放多个宏,不过第一个宏的名字要跟文件名相同
只放一个宏管理起来不会很吃力么?至少我觉得修改的时候挺不方便的
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 是的,想当然了。确实可以一个文件多个宏。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Practice Is The Best Teacher!

使用道具

19
playmore 发表于 2013-6-21 16:38:18 |只看作者 |坛友微信交流群
zhou.wen 发表于 2013-6-21 14:34
我习惯把宏存在服务器数据库中,存成text格式,需要的时侯根据id或命名取出来
这样方便做分布式运算
我在服务器上使用我的宏的做法是在AUTOEXEC.SAS文件中添加

options mautosource sasautos =(sasautos, "\\xxxx\d:\Works\Macros\");

即让服务器读存在我本地的宏,这样服务器上不会存有我的宏
而且只要把这个文件存在服务器的SAS安装目录就好了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

20
zhou.wen 发表于 2013-6-21 16:46:27 |只看作者 |坛友微信交流群
playmore 发表于 2013-6-21 16:38
我在服务器上使用我的宏的做法是在AUTOEXEC.SAS文件中添加

options mautosource sasautos =(sasautos, ...
设置共享目录,或者映射网络硬盘也是不错的选择
我的不同,跟你恰好相反。存在服务器数据库中的宏是提供给进行分布式运算的pc读取的。给每台运算pc配置共享目录实在不是个好主意



Practice Is The Best Teacher!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-12 08:58