1、簡介 java
SAS經過宏過程能夠把 數據步或者過程步的功能進行封裝,在宏過程當中能夠定義參數,經過調用宏過程把實參傳遞給形參進行引用。宏過程就至關於關係數據庫中的存儲過程,調用時只須要知道宏過程名就能夠,具體的內部如何實現不用瞭解,實現了程序的封裝。 數據庫
2、宏過程執行機制 編程
對於宏語言,SAS有本身的內部處理機制,宏程序編寫好後,首先進行宏編譯,生成宏程序,調用時經過宏分析器解析,而後在編譯過程當中若是宏程序有錯誤,會在日誌中顯示。 編輯器
宏執行的流程: 函數
SAS程序先提交進入緩衝區,而後經過字符掃描組件識別到宏程序,調用宏TOKEN解析器,TOKEN解析器的四個普通組件對宏程序進行解析,解析完成交給編譯器編譯程序,如有錯誤,程序編譯階段會在日誌中顯示錯誤信息,沒有錯誤編譯經過,用戶經過調用宏語法,調用執行宏。 spa
TOKEN解析器的四個組件及其功能以下: 操作系統
(1)Literal組件 調試
Literal組件解析用單引號或雙引號括起來的字符串,如'yang',"chang"。 日誌
(2)Number組件 code
Number組件解析數值類型、日期類型、時間類型和十六進制數值,如2三、'20110323'd。
(3)Name組件
Name組件解析以字母或下劃線開始的字符串,如c_b、_d。
(4)Special組件
Special組件解析一些特殊字符串或字符串組,如@、#、*、/、+、-、**、;、$、()、.、&、%、=等。
下邊咱們介紹一個簡單的程序講解宏程序執行機制,以下:
%let x=5; %MACRO add; %let y=%eval(&x+1); %put y=&y; RUN; %MEND add; %add;
宏功能總結以下:
1)實現程序的重複利用,減小了文本的輸入量。
2)實現了程序功能的封裝。
3)實現變量的傳遞。
4)獲取SAS系統信息與其餘系統的交互。
5)不一樣數據步與過程步之間傳遞數據與參數。
3、宏的定義和使用
宏變量和數據步中的變量是不一樣的,宏變量能夠在SAS程序的任何地方引用和定義,屬於弱類型語句。宏變量有兩種,一種是用戶定義的宏變量,一種是SAS系統內部具備的自動宏變量。對於用戶定義的宏變量是指用戶根據需求定義的變量,對於用戶定義的宏變量用戶能夠給變量賦值,也能夠爲空,能夠指定範圍,經過%GLOBAL聲明能夠定義全局宏變量,默認是全局宏變量。
1)用戶定義的宏變量
宏變量的定義語法是:%let 宏變量名 <= 賦實際值>;
對於宏變量的引用,須要「&」符號,具體語法如:&宏名
注意:間接引用宏變量要用兩個&&符號,如「&&v_var1.&v_var2」,這裏的點「.」屬於間接引用分隔,告訴SAS系統是兩個宏變量,「&&v_var1」中的第一個「&」符號是告訴SAS系統啓動宏TOKEN解析器,而後讀到「&v_var1」引用此宏變量。
一個小例子
%let x=5; %let y=&x; 程序中定義的宏變量x,在定義的宏變量y中的引用。 經過符號「&」把x宏變量的值賦給y宏變量。
所謂的自動宏變量是SAS系統內部已經定義好的變量,不須要用戶再定義,用到時直接調用。
經常使用的自動宏變量以下:
系統內部自動宏變量 | 說明 |
_AUTOMATIC | 查看全部系統自動宏變量 |
SYSDATE | 查看當前日期 |
SYSVER | 查看SAS當前版本 |
SYSLAST | 查看SAS當前最新生成的數據集信息 |
SYSTIME | 查看當前系統時間 |
SYSSCP | 查看用戶所使用的操做系統 |
SYSDAY | 查看當前星期幾 |
_ALL_ | 查看用戶建立的宏變量 |
_USER_ | 查看用戶定義的宏變量 |
_GLOBAL_ | 查看用戶定義的全局宏變量 |
_LOCAL_ | 查看用戶定義的局部宏變量 |
(2)對於文本串中的引用宏變量,必須用雙引號括起來,而不能用單引號。如:
%let city=beijing; DATA c; x="I am from &city"; /*引用宏變量city*/ RUN;
%let v_var=%宏函數();
3)宏過程
宏過程內部能夠調用數據步或過程步的機制,能夠包含循環和分支語句。對於宏過程而言,用戶所調用的宏過程都是已經編譯好的,宏過程當中包含一個寫程序的聲明,接收外部傳遞的參數。
宏過程的語法格式: %MACRO 宏名 <(宏參數)> </參數選項>;
宏功能語句:%MEND <宏名>
例子:編寫一個宏過程,實現加法運算。
%MACRO add_sum(v_x,v_y); /*宏過程開始,定義宏名*/ %let v_sum=%eval(&v_x+&v_y); /*調用宏函數%eval(),實現整數運算*/ %put &v_sum; /*宏變量引用要用&符號,輸出到日誌窗口*/ %MEND add_sum; /*宏過程結束標誌,結束宏名*/ %add_sum(2,6); /*調用宏過程*/
(1)宏過程add_sum包含兩個形參,SAS系統對編輯好的宏過程提交後先輸入帶緩衝區,而後經過字符掃描組件判斷出是宏過程,調入TOKEN解析器,經過TOKEN解析器四個組件解析宏語句,解析完成,傳送到編譯器編譯程序,檢查沒有語法錯誤後,編譯經過。
(2)%add_sum(2,6)調用宏過程,並把實參2傳遞給v_x變量,6傳遞給v_y變量,實現求和運算。
注意:SAS中引用宏變量要加「&」符號。宏過程當中能夠經過「%put」語句把宏變量值輸出到日誌(LOG)窗口,經過這個能夠調試宏過程。
4、宏經常使用語句
1)%PUT
%PUT宏語句能夠把信息輸出到日誌窗口,幫助調試程序。
語法格式:%PUT <選項語句>;
%PUT:輸出宏語句若是後邊不帶選項語句,則輸出一個空行到SAS日誌窗口。
所以%PUT宏語句在調試程序BUG時常常用,能夠把信息顯示到日誌窗口,便於查找程序錯誤。
5、宏過程調用
宏過程調用語法格式: %宏過程名 <(實參)>;
%:百分號是調用宏過程的語法關鍵字,必選項。
下邊是一個例子:
%MACRO xy; /*無參數宏過程*/ PROC print data=sashelp.buy; RUN; %MEND xy; %xy; /*無參數宏過程調用*/ 解讀:宏過程封裝了打印過程,打印邏輯庫sashelp中的數據集buy, 無參數。「%xy」直接寫宏過程名,此處不須要參數項。
宏語句 | 說明 |
%ABORT | 結束當前宏運行,屬於宏定義中的語句 |
%COPY | 從SAS宏邏輯庫中複製指定的對象 |
%GLOBAL | 建立全局宏變量語句 |
%LOCAL | 建立局部宏變量語句 |
%LET | 定義宏變量語句 |
%PUT | 輸出文本或宏變量信息到日誌窗口展現 |
%IF %THEN %ELSE | 條件選擇宏語句 |
%DO %UNTIL | 重複執行語句塊中的宏語句,知道UNTIL後條件爲真 |
%DO %WHILE | WHILE語句後條件爲真,重複執行語句塊中的宏語句 |
%DO %TO | 循環宏語句 |
%DO %END | 宏子功能塊語句 |
%DO %TO<%BY> | 循環迭代語句 |
1)宏計算函數
宏計算函數實現加、減、乘、除四則運算的功能。
宏計算函數 | 功能 |
%EVAL | 實現整數運算 |
%SYSEVALF | 實現浮點數據運算 |
1.%EVAL()宏函數 函數格式: %EVAL(整數的數學運算) %MACRO cum(x,y); /*定義宏過程*/ %let z=%eval(&x*&y); /*%eval函數進行整數運算*/ %put &z; %MEND cum; /*宏過程結束標誌*/ %cum(88,11); /*調用宏過程*/ 程序解讀: %EVAL宏函數實現z=x*y 兩個整數的乘法運算,日誌窗口顯示z=968 2.%SYSEVALF()宏函數 函數格式:%SYSEVALF(浮點數,<數值類型>) %MACRO cumf(x,y); /*定義宏過程*/ %let f=%sysevalf(&x+&y); /*%sysevalf函數進行浮點數運算*/ %put &f; %MEND cumf; /*宏過程結束標誌*/ %cumf(98.2,1.1); /*調用宏過程*/ 程序解讀: %SYSEVALF函數計算x+y的浮點數運算,經過日誌窗口顯示信息能夠看到f=x+y=99.3
2)宏字符處理函數
宏字符處理函數只對字符類型的值進行處理。
宏字符處理函數 | 功能 |
%TRIM | 過濾文本尾部的空格 |
%QTRIM | 過濾包含特殊字符文本的尾部空格 |
%LENGTH | 計算字符串變量長度 |
%INDEX | 查找一個字符串中字符出現的位置 |
%SUBSTR | 從指定的字符串中提取子串 |
%UPCASE | 將指定的字符串轉化爲大寫 |
%QSCAN | 根據特殊分隔符查找,並提取子串 |
%SCAN | 根據指定分隔符查找,並提取子串 |
其餘經常使用重要宏函數,不能歸於上面兩類的宏函數,也是常常用到的。
宏函數 | 功能 |
%INCLUDE | 指明包含的外部文件路徑 |
%SYSFUNC | 宏變量中調用SAS內部函數或者用戶自定義函數 |
%STR | 引用包除特殊符號的固定文本,特殊符號如# % & |
%NRSTR | 引用包含特殊符號的固定文本 |