作者Maninck (我是大天才^o^/)
站内Statistics
标题Re: [程式] SAS MACTRO 变数的问题
时间Mon Aug 1 19:33:33 2011
感谢tew大所提供的方法我做出来了
(我也试了一下west1996大所提供的方法二,不过在macro很多层时,会乱掉)
不过现在遇到了其他的问题
问题一:
当没有绿色的那些程式码时,他可以跑出两个档
但当加上去时,就会出现错误
ERROR: File WORK.DATA.DATA does not exist.
但我完全看不出这是啥错,我程式也没去用到DATA.DATA这个档,怎麽会有这行?
问题二:
有没有让错误log可以更清楚的方式或是对照表?
不然像这次,出现这行我完全看不出是啥原因@@
%INCLUDE "G:\pgm\util\CD_LAYOUT.sas";
Libname a 'G:\pgm\test\output';
%MACRO CD_MERGE;
DATA a.CD_ALL;
SET
%DO i=1996 %TO 1996;
%DO j =1 %TO 2;
%IF &j < 10 %THEN %LET k = 0&j;
%ELSE %LET k = &j;
%LOCAL input output;
%LET input = "G:\pgm\test\data\CD&i.&k..DAT";
%LET output = "G:\pgm\test\output\CD&i.&k.";
%CD_LAYOUT(&i , &input ,&output);
&output;
%END;
%END;
;
RUN;
%MEND;
%INCLUDE "G:\pgm\bo\CD1996_2003.sas";
%INCLUDE "G:\pgm\bo\CD2004_9999.sas";
%MACRO
CD_LAYOUT (year , input , output);
%IF &year <= 2003 %THEN
%CD1996_2003(&input, &output);
%ELSE
%CD2004_9999(&input, &output);
%MEND;
%MACRO
CD1996_2003 (input,output);
DATA &output;
INFILE &input lrecl=42 missover;
INPUT FEE_YM $1-6
APPL_TYPE $7
HOSP_ID $8-41
RUN;
%MEND;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.94.201
※ 编辑: Maninck 来自: 118.168.94.201 (08/01 19:34)
1F:推 west1996:%cd_layout里面是啥?感觉你语法写错了,确定set後面是吐 08/01 23:00
2F:→ west1996:出一个data name吗? 08/01 23:00
3F:→ west1996:macro在debug时可先宣告options mprint mlogic symbolgen 08/01 23:01
4F:→ west1996:这三个(或部分),这样在log档里面就可以看出你的每一个 08/01 23:02
5F:→ west1996:macro variable被解译成什麽东西 08/01 23:03
cd_layout里面是把input做成output(已补上程式码)
我加了全部的log,只发现他是在传到CD1996_2003要做
蓝色那行出错
但还是看不出来为啥会出这个错〒△〒
LOG如下:
MLOGIC(CD_LAYOUT): %IF condition &year <= 2003 is TRUE
MLOGIC(CD1996_2003): Beginning execution.
SYMBOLGEN: Macro variable INPUT resolves to "G:\pgm\test\data\CD199601.DAT"
SYMBOLGEN: Macro variable OUTPUT resolves to "G:\pgm\test\output\CD199601"
MLOGIC(CD1996_2003): Parameter INPUT has value
"G:\pgm\test\data\CD199601.DAT"
MLOGIC(CD1996_2003): Parameter OUTPUT has value "G:\pgm\test\output\CD199601"
SYMBOLGEN: Macro variable OUTPUT resolves to "G:\pgm\test\output\CD199601"
MPRINT(CD1996_2003): DATA "G:\pgm\test\output\CD199601";
ERROR: File WORK.DATA.DATA does not exist.
SYMBOLGEN: Macro variable INPUT resolves to "G:\pgm\test\data\CD199601.DAT"
※ 编辑: Maninck 来自: 118.168.92.4 (08/02 08:08)
6F:推 west1996:蓝色的data後面要用libname.dataname的格式,不能直接使 08/02 10:21
7F:→ west1996:用系统路径的格式 08/02 10:21
8F:→ west1996:data &output改成data a.CD&i.&k. 08/02 10:24
9F:→ Maninck:可是~~为什麽在没有绿色那些字~~却可以执行~~而且有档案产 08/02 19:48
10F:→ Maninck:生@@ 08/02 19:48
11F:→ Maninck:对了~~我忘了说~~这三只macro都是在不同程式里@@ 08/02 20:12
12F:→ Maninck:所以我才要把档名从外面一直传进去 08/02 20:14
13F:→ west1996:其实...感觉上比较像是你对基本的data step的语法结构就 08/03 00:51
14F:→ west1996:不是很了解,就想要使用macro语法,有一点小孩开大车的感 08/03 00:53
15F:→ west1996:觉。另外,macro的整个结构改得很怪,只是不知道是不是你 08/03 00:54
16F:→ west1996:实务上真的必需要拆成这些元件,因为macro的切断点和引数 08/03 00:55
17F:→ west1996:的传递都有点乱@@ 08/03 00:55
18F:→ west1996:可以试着先把所有的macro变数拿掉,用一个special case去 08/03 00:57
19F:→ west1996:跑跑看一般的data step,应该会发现也是不能跑,因为问题 08/03 00:58
20F:→ west1996:是出在data step的结构错误,跟macro其实没有关系 08/03 00:58
21F:→ Maninck:哈哈~~我才刚写不到一个星期,因为我看他说macro类似巨集 08/03 07:18
22F:→ Maninck:所以我就想试试可不可以跟一般程式的写法一样~~可以传参数 08/03 07:19
23F:→ Maninck:和return值 08/03 07:19
我大概知道错在哪了~~
我猜应该是marco的处理程序和一般的程式不一样
marco他只是把程式合在一起,并不是会先处理。
所以原本的写法
他会看成下面的程式
蓝绿色是%MACRO CD_LAYOUT
黄色是%MACRO CD1996_2003
这样就会变成DATA SET DATA这种错误语法的状况
因此在一开始没加DATA(
红色那句)时并不会出错,加了才会出错。
SAS自动转换成的程式
%INCLUDE "G:\pgm\util\CD_LAYOUT.sas";
Libname a 'G:\pgm\test\output';
%MACRO CD_MERGE;
DATA a.CD_ALL;
SET
%DO i=1996 %TO 1996;
%DO j =1 %TO 2;
%IF &j < 10 %THEN %LET k = 0&j;
%ELSE %LET k = &j;
%LOCAL input output;
%LET input = "G:\pgm\test\data\CD&i.&k..DAT";
%LET output = "G:\pgm\test\output\CD&i.&k.";
%CD_LAYOUT(&i , &input ,&output);
%IF &year <= 2003 %THEN
DATA &output;
INFILE &input lrecl=42 missover;
INPUT FEE_YM $1-6
APPL_TYPE $7
HOSP_ID $8-41
RUN;
%ELSE
%CD2004_9999(&input, &output);
&output;
%END;
%END;
;
RUN;
%MEND;
把程式改成下面这个就会过了
%MACRO CD_MERGE;
%DO i=1996 %TO 1996;
%DO j =1 %TO 2;
%IF &j < 10 %THEN %LET k = 0&j;
%ELSE %LET k = &j;
%CD_LAYOUT(&i,"G:\pgm\test\data\CD&i.&k..DAT"
,"G:\pgm\test\output\CD&i.&k.");
%END;
%END;
;
RUN;
Data a.CD_ALL;
SET
%DO i=1996 %TO 1996;
%DO j =1 %TO 2;
%IF &j < 10 %THEN %LET k = 0&j;
%ELSE %LET k = &j;
%LET tmp = "G:\pgm\test\output\CD&i.&k.";
&tmp
%END;
%END;
;
RUN;
%MEND;
※ 编辑: Maninck 来自: 118.168.90.5 (08/03 07:57)
24F:推 imaltar:你的门诊档是切1~12个月 所以你现在把这12个月和一起是吧 08/03 08:41
25F:→ Maninck:我是要做合并的动作,但不限是什麽档,我想切模组主要的用 08/03 13:12
26F:→ Maninck:意就在我希望是任何档都适用,因为他就是一个合并档案的功 08/03 13:13
27F:→ Maninck:能,不管他是几个,反正就是要合并档案 08/03 13:13