Re: [程式] SAS MACTRO 變數的問題
感謝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)
推
08/01 23:00, , 1F
08/01 23:00, 1F
→
08/01 23:00, , 2F
08/01 23:00, 2F
→
08/01 23:01, , 3F
08/01 23:01, 3F
→
08/01 23:02, , 4F
08/01 23:02, 4F
→
08/01 23:03, , 5F
08/01 23:03, 5F
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)
推
08/02 10:21, , 6F
08/02 10:21, 6F
→
08/02 10:21, , 7F
08/02 10:21, 7F
→
08/02 10:24, , 8F
08/02 10:24, 8F
→
08/02 19:48, , 9F
08/02 19:48, 9F
→
08/02 19:48, , 10F
08/02 19:48, 10F
→
08/02 20:12, , 11F
08/02 20:12, 11F
→
08/02 20:14, , 12F
08/02 20:14, 12F
→
08/03 00:51, , 13F
08/03 00:51, 13F
→
08/03 00:53, , 14F
08/03 00:53, 14F
→
08/03 00:54, , 15F
08/03 00:54, 15F
→
08/03 00:55, , 16F
08/03 00:55, 16F
→
08/03 00:55, , 17F
08/03 00:55, 17F
→
08/03 00:57, , 18F
08/03 00:57, 18F
→
08/03 00:58, , 19F
08/03 00:58, 19F
→
08/03 00:58, , 20F
08/03 00:58, 20F
→
08/03 07:18, , 21F
08/03 07:18, 21F
→
08/03 07:19, , 22F
08/03 07:19, 22F
→
08/03 07:19, , 23F
08/03 07:19, 23F
我大概知道錯在哪了~~
我猜應該是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)
推
08/03 08:41, , 24F
08/03 08:41, 24F
→
08/03 13:12, , 25F
08/03 13:12, 25F
→
08/03 13:13, , 26F
08/03 13:13, 26F
→
08/03 13:13, , 27F
08/03 13:13, 27F
討論串 (同標題文章)
完整討論串 (本文為第 5 之 5 篇):