Re: [程式] SAS MACTRO 變數的問題

看板Statistics作者 (我是大天才^o^/)時間12年前 (2011/08/01 19:33), 編輯推噓3(3024)
留言27則, 3人參與, 最新討論串5/5 (看更多)
感謝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
%cd_layout裡面是啥?感覺你語法寫錯了,確定set後面是吐
08/01 23:00, 1F

08/01 23:00, , 2F
出一個data name嗎?
08/01 23:00, 2F

08/01 23:01, , 3F
macro在debug時可先宣告options mprint mlogic symbolgen
08/01 23:01, 3F

08/01 23:02, , 4F
這三個(或部分),這樣在log檔裡面就可以看出你的每一個
08/01 23:02, 4F

08/01 23:03, , 5F
macro variable被解譯成什麼東西
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
藍色的data後面要用libname.dataname的格式,不能直接使
08/02 10:21, 6F

08/02 10:21, , 7F
用系統路徑的格式
08/02 10:21, 7F

08/02 10:24, , 8F
data &output改成data a.CD&i.&k.
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
對了~~我忘了說~~這三隻macro都是在不同程式裡@@
08/02 20:12, 11F

08/02 20:14, , 12F
所以我才要把檔名從外面一直傳進去
08/02 20:14, 12F

08/03 00:51, , 13F
其實...感覺上比較像是你對基本的data step的語法結構就
08/03 00:51, 13F

08/03 00:53, , 14F
不是很瞭解,就想要使用macro語法,有一點小孩開大車的感
08/03 00:53, 14F

08/03 00:54, , 15F
覺。另外,macro的整個結構改得很怪,只是不知道是不是你
08/03 00:54, 15F

08/03 00:55, , 16F
實務上真的必需要拆成這些元件,因為macro的切斷點和引數
08/03 00:55, 16F

08/03 00:55, , 17F
的傳遞都有點亂@@
08/03 00:55, 17F

08/03 00:57, , 18F
可以試著先把所有的macro變數拿掉,用一個special case去
08/03 00:57, 18F

08/03 00:58, , 19F
跑跑看一般的data step,應該會發現也是不能跑,因為問題
08/03 00:58, 19F

08/03 00:58, , 20F
是出在data step的結構錯誤,跟macro其實沒有關係
08/03 00:58, 20F

08/03 07:18, , 21F
哈哈~~我才剛寫不到一個星期,因為我看他說macro類似巨集
08/03 07:18, 21F

08/03 07:19, , 22F
所以我就想試試可不可以跟一般程式的寫法一樣~~可以傳參數
08/03 07:19, 22F

08/03 07:19, , 23F
和return值
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
你的門診檔是切1~12個月 所以你現在把這12個月和一起是吧
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
文章代碼(AID): #1EDeyFbu (Statistics)
文章代碼(AID): #1EDeyFbu (Statistics)