推 west1996:%cd_layout裡面是啥?感覺你語法寫錯了,確定set後面是吐 08/01 23:00
→ west1996:出一個data name嗎? 08/01 23:00
→ west1996:macro在debug時可先宣告options mprint mlogic symbolgen 08/01 23:01
→ west1996:這三個(或部分),這樣在log檔裡面就可以看出你的每一個 08/01 23:02
→ 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)
推 west1996:藍色的data後面要用libname.dataname的格式,不能直接使 08/02 10:21
→ west1996:用系統路徑的格式 08/02 10:21
→ west1996:data &output改成data a.CD&i.&k. 08/02 10:24
→ Maninck:可是~~為什麼在沒有綠色那些字~~卻可以執行~~而且有檔案產 08/02 19:48
→ Maninck:生@@ 08/02 19:48
→ Maninck:對了~~我忘了說~~這三隻macro都是在不同程式裡@@ 08/02 20:12
→ Maninck:所以我才要把檔名從外面一直傳進去 08/02 20:14
→ west1996:其實...感覺上比較像是你對基本的data step的語法結構就 08/03 00:51
→ west1996:不是很瞭解,就想要使用macro語法,有一點小孩開大車的感 08/03 00:53
→ west1996:覺。另外,macro的整個結構改得很怪,只是不知道是不是你 08/03 00:54
→ west1996:實務上真的必需要拆成這些元件,因為macro的切斷點和引數 08/03 00:55
→ west1996:的傳遞都有點亂@@ 08/03 00:55
→ west1996:可以試著先把所有的macro變數拿掉,用一個special case去 08/03 00:57
→ west1996:跑跑看一般的data step,應該會發現也是不能跑,因為問題 08/03 00:58
→ west1996:是出在data step的結構錯誤,跟macro其實沒有關係 08/03 00:58
→ Maninck:哈哈~~我才剛寫不到一個星期,因為我看他說macro類似巨集 08/03 07:18
→ Maninck:所以我就想試試可不可以跟一般程式的寫法一樣~~可以傳參數 08/03 07:19
→ 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)
推 imaltar:你的門診檔是切1~12個月 所以你現在把這12個月和一起是吧 08/03 08:41
→ Maninck:我是要做合併的動作,但不限是什麼檔,我想切模組主要的用 08/03 13:12
→ Maninck:意就在我希望是任何檔都適用,因為他就是一個合併檔案的功 08/03 13:13
→ Maninck:能,不管他是幾個,反正就是要合併檔案 08/03 13:13