最近,公司檢查SDTM CT的宏程序更新了一版完残,在運(yùn)用過程中總會(huì)有Issue存在。在解決Issue的過程中横漏,我弄清了這個(gè)宏的代碼思路谨设。這個(gè)思路對(duì)于我來講,是比較新穎和奇妙的缎浇。
日常我們工作的重點(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)長(zhǎng)。于是踩验,我就自己試著解決這個(gè)問題了鸥诽。下面介紹一下,解決宏程序issue的思路箕憾。
宏程序相關(guān)issue問題的解決牡借,一般有兩個(gè)思路:
- 查看宏程序的源代碼;
- 輸出宏程序運(yùn)行時(shí)的代碼袭异。
這兩個(gè)途徑各有優(yōu)缺點(diǎn)钠龙。一般在宏程序的源代碼中,宏程序以及各個(gè)宏參數(shù)的作用都會(huì)有詳細(xì)的說明,通過這一塊我們可以對(duì)宏程序有整體的清晰認(rèn)知俊鱼。但對(duì)于宏程序具體運(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è)簡(jiǎn)單的宏程序進(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é)果如下:
對(duì)應(yīng)地址下TXT文件內(nèi)容如下:
當(dāng)然星掰,可以直接將宏程序運(yùn)行內(nèi)容直接輸出到.sas
文件中(不過多望,個(gè)人覺得TXT文檔打開比較方便快捷):
filename mprint "./Print.sas";
以上。
若有疑問氢烘,歡迎評(píng)論區(qū)交流怀偷!