最近,公司檢查SDTM CT的宏程序更新了一版,在運(yùn)用過程中總會(huì)有Issue存在。在解決Issue的過程中,我弄清了這個(gè)宏的代碼思路。這個(gè)思路對于我來講,是比較新穎和奇妙的。
日常我們工作的重點(diǎn)是相關(guān)標(biāo)準(zhǔn)、規(guī)則的應(yīng)用,編程內(nèi)容并不復(fù)雜。編程中具體宏的開發(fā),有專門的團(tuán)隊(duì)去開發(fā)、維護(hù)。不過從遇到問題到相關(guān)部門解決這個(gè)問題,流程時(shí)間稍微有點(diǎn)長。于是,我就自己試著解決這個(gè)問題了。下面介紹一下,解決宏程序issue的思路。
宏程序相關(guān)issue問題的解決,一般有兩個(gè)思路:
- 查看宏程序的源代碼;
- 輸出宏程序運(yùn)行時(shí)的代碼。
這兩個(gè)途徑各有優(yōu)缺點(diǎn)。一般在宏程序的源代碼中,宏程序以及各個(gè)宏參數(shù)的作用都會(huì)有詳細(xì)的說明,通過這一塊我們可以對宏程序有整體的清晰認(rèn)知。但對于宏程序具體運(yùn)行環(huán)節(jié)的內(nèi)容,直接看源代碼的效率并不高,因?yàn)楹瓿绦蛑锌赡苌婕按罅亢陾l件、宏循環(huán)語句,不容易展現(xiàn)實(shí)際運(yùn)行的具體思路。這時(shí)候,直接查看宏運(yùn)行的程序,效率就高很多。
我檢查CT宏程序運(yùn)用的是第二個(gè)思路。這里介紹兩個(gè)宏系統(tǒng)選項(xiàng):
options mprint symbolgen;
MPRINT
宏系統(tǒng)選項(xiàng),指定是否將宏執(zhí)行生成的SAS語句寫入SAS日志。這樣我們可以直接SAS日志中查看宏程序?qū)嶋H執(zhí)行的語句,方便定位具體的issue發(fā)生的代碼塊。NOMPRINT
是不輸出的選項(xiàng)。我用一個(gè)簡單的宏程序進(jìn)行舉例:
oprions mprint;
%macro print(indt=);
proc print data = &indt.;
run;
%mend;
%print(indt=sashelp.class);
運(yùn)行以上程序,SAS日志中顯示了宏程序?qū)嶋H執(zhí)行的語句:
SYMBOLGEN
宏系統(tǒng)選項(xiàng),指定是否將解析宏變量引用的結(jié)果寫入SAS日志以進(jìn)行調(diào)試。這個(gè)選項(xiàng)方便查看,宏程序運(yùn)行過程中,宏變量的具體值。NOSYMBOLGEN
是不輸出的選項(xiàng)。具體看代碼演示:
options nomprint symbolgen ;
%macro print(indt=);
proc print data = &indt.;
run;
%mend;
%print(indt=sashelp.class);
宏程序?qū)嶋H運(yùn)行過程中,宏變量的解析值就會(huì)在日志中顯現(xiàn),方便調(diào)試代碼:
通常,我會(huì)直接使用這兩個(gè)選項(xiàng),先在日志中查看宏程序的具體運(yùn)行代碼;如果代碼比較復(fù)雜,直接閱讀不容易理解,我會(huì)日志內(nèi)容復(fù)制到程序中,刪除不必要的文字說明,直接一步一步運(yùn)行程序,進(jìn)行理解。
當(dāng)然,你也可以將MPRINT
內(nèi)容輸出到外部文件中,這需要使用MFILE
宏系統(tǒng)選項(xiàng),并指定具體的輸出路徑。大多數(shù)情況我是直接總SAS日志中復(fù)制的,這樣比較便捷。不過,使用MPRINT
選項(xiàng)也有一個(gè)優(yōu)點(diǎn),輸出的內(nèi)容是完整的運(yùn)行程序,不會(huì)有多余的說明文字。這就不必像從日志復(fù)制內(nèi)容那樣,進(jìn)行刪減處理。具體看以下程序:
options mprint symbolgen mfile ;
filename mprint "./Print.txt";
%macro print(indt=);
proc print data = &indt.;
run;
%mend;
%print(indt=sashelp.class);
options nomprint;
日志輸出結(jié)果如下:
對應(yīng)地址下TXT文件內(nèi)容如下:
當(dāng)然,可以直接將宏程序運(yùn)行內(nèi)容直接輸出到.sas
文件中(不過,個(gè)人覺得TXT文檔打開比較方便快捷):
filename mprint "./Print.sas";
以上。
若有疑問,歡迎評論區(qū)交流!