看板 Statistics 關於我們 聯絡資訊
感謝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)
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