官术网_书友最值得收藏!

2.2 SAS編程語法

學習任何編程語言首先要把這門語言的基礎語法學好,這就相當于蓋一棟樓,地基要打好一樣。對于SAS編程而言,SAS語法就是基礎,學好基礎語法才能靈活運用,寫出更優秀、更高效率的程序。讓實例幫助理解基礎語法學習,是一種更快、更好、更深入理解語法的有效方法。

2.2.1 變量

變量是描述某字段的屬性,就相當于在ORACLE數據庫表中定義的列,列中的變量是有屬性的,如字符、數值、日期等。SAS中變量有兩種類型,即數值型和字符型。SAS中的變量在使用時不需要定義,它屬于弱類型的,具體類型依賴于賦值類型。

1.命名規范

SAS中變量的命名規范是以字母(a,b,c,…,z)或下畫線“_”開始,字母不區分大小寫,后面的字符可以是數字、字母或下畫線。不能在定義變量時使用系統保留的名稱,系統保留名稱有“_all_”“_N_”“_ERROR_”“_INFILE_”“_CHARACTER_”等,不能使用特殊字符(如%、&、#)和空格,最長32個字符。

【例2.4】命名變量舉例。

正確的命名:a1、_c、L_。

錯誤的命名:#d、&。

2.變量賦值

SAS中給變量賦值是指在數據步(DATA STEP)中通過INPUT語句將外部文件中的數據、CARDS或DATALINES后面的輸入數據賦值給變量。也可以在數據步直接給變量賦值。如果是外部存在的數據文件,讀入時用INFILE語句獲取外部數據文件,但字段變量要在INPUT語句中定義。

【提示】INPUT語句讀入的字符變量默認長度為8個字節,超過8個字節就要使用LENGTH語句先定義變量并指明其長度。

【注意】INPUT語句和LENGTH語句中定義的變量如果是字符型的要加$(美元符號)。

【例2.5】定義變量c和x并給其賦值。

【例2.6】讀取18位的身份證號和性別的數據,建立數據集iden。

【程序解讀】

INPUT語句中定義變量id和sex兩個變量,然后PDV指針控制讀取CARDS語句中的數據。

輸出顯示結果如圖2-13所示。

圖2-13 身份證和性別輸出窗口

【例2.7】讀入d:\sastest\yxy目錄下的數據文件emp.txt,把數據存儲到INPUT語句定義的變量中。

【程序解讀】

1)%let語句定義宏變量f1,這個變量存儲的值為外部文件存儲位置的物理路徑。

2)數據步通過INFILE語句讀入f1變量中指定的物理路徑下的數據文件。

3)由于身份證號碼長度超過默認長度8個字節,用LENGTH語句定義變量并指定變量長度。

4)INPUT語句定義變量bhao為字符類型,name為字符類型,id變量為LENGTH語句中定義的變量。

5)調用打印輸出過程PRINT,這個過程可以不需要,但對于首次開發調試程序而言,可以通過此程序查看數據集生成數據的正確性。

輸出窗口顯示結果如圖2-14所示。

圖2-14 讀取外部文件輸出窗口

3.變量類型轉換規則

SAS對于變量類型字符型與數值型之間自動轉換規則如下。

(1)字符型轉換為數值型

●字符型變量和數值型變量做運算或比較運算時,字符型變量會自動轉換為數值型變量。

●字符型變量賦值給數值型變量時,字符型變量會自動轉換為數值型變量。

【例2.8】字符b變量自動轉換為數值型,與a做加法運算。

【程序解讀】

由于SAS屬于弱類型語言,b變量為字符型,在c變量中引用a與b變量一起做加法運算時自動轉換為數值型。

輸出窗口顯示結果c=11,如圖2-15所示。

圖2-15 字符型變量自動轉換為數值型變量運算輸出窗口

(2)數值型轉換為字符型

●數值型變量賦值給字符型變量時,數值型變量會自動轉換為字符型變量。

●數值型變量與字符型變量做字符連接運算時,數值型變量會自動轉換為字符型變量。

●數值型變量用在字符處理函數中時,數值型變量會自動轉換為字符型變量。

【例2.9】數值型變量y與字符型變量l做連接運算。

【程序解讀】

數據步中變量y為數值型,變量h的值為l變量與y變量的連接串的值,此處l變量自動轉換為字符型。

輸出窗口顯示如圖2-16所示。

圖2-16 數值型變量自動轉換為字符型變量運算輸出窗口

【例2.10】處理字符型函數把數值型變量自動轉換為字符型。

【程序解讀】

數據步中變量a為數值型,變量b中的值為通過字符處理函數substr截取a變量的值,此處a自動轉換為字符型引用。日志窗口顯示如圖2-17所示。

圖2-17 字符型函數截取數值型變量轉換后為字符型日志窗口

【提示】此處a在字符型函數中被轉換為BEST12的輸出格式。字符值右對齊,相當于左邊補空格,補到12位。

2.2.2 觀測值

通俗地說,觀測值就是記錄個體屬性的列屬性集,顯示個體的一條記錄。數據庫中表的一條行記錄,就屬于一條觀測值。

【例2.11】下面顯示了5行觀測值的記錄,如圖2-18所示。

圖2-18 數據集中的觀測值

2.2.3 常量

SAS中定義的常量與其他語言中定義的常量基本定義相同,是相對變量而言的。變量可以重新賦值,而常量是固定不變的值。

SAS中經常用的常量類型有三種,即字符型常量、數值型常量和日期型常量,還有一種十六進制常量,但不經常用到。

1.字符型常量

一般字符型常量用單引號或雙引號括起來都可以,效果一樣。

【例2.12】一般常量賦值給變量。

【程序解讀】

數據步中的u變量用單引號括起字符串;s變量用雙引號括起字符串;對比輸出信息可以看到兩種方式都可以處理字符串,效果一樣。

輸出窗口顯示如圖2-19所示。

圖2-19 一般常量賦值給變量輸出顯示窗口

對于字符型常量中包含特殊字符的常量,對單引號和雙引號的使用有要求。如果字符型常量中包含單引號,外面就用雙引號括起來;如果字符常量中包含雙引號,外面就用單引號括起來。

【例2.13】包含單引號和雙引號的兩個常量賦值給變量。

【程序解讀】

數據步y變量中的賦值字符串包含單引號,要使單引號包含在字符串中,外面用雙引號括起來;對比c變量字符串賦值中包含雙引號,要使雙引號包含在字符串中,外面用單引號括起來。讀者在對比中學習,可以發現其不同點,更容易掌握知識點。

輸出窗口顯示如圖2-20所示。

圖2-20 單雙引號常量賦值給變量輸出窗口

2.數值型常量

數值型常量就是類型為數值的常量。如果數值型常量大于1032-1,則必須用科學計數法表示。

【例2.14】數值型常量賦值給變量。

【程序解讀】

數值型常量直接賦值給變量,變量不需要定義。

輸出窗口顯示結果如圖2-21所示。

圖2-21 數值型常量賦值給變量輸出顯示窗口

3. 日期型常量

日期型常量包括日期(date)、時間(time)和日期時間(datetime)三種類型。這三個類型的常量都要用單引號或雙引號括起來。日期型的常量后面加字母d,時間型的常量后面加字母t,日期時間型的常量后面加字母dt。

【例2.15】日期、時間和日期時間類型的三個常量分別賦值給變量。

【程序解讀】

對于日期、時間和日期時間類型的值,賦值數據帶標識符號,本實例中date1變量為日期型,后面加d(date)表示為日期類型;time1變量為時間類型,后面賦值數據加t(time)表示為時間類型數據;datetime1變量為日期時間,賦值數據后面加dt(datetime)表示日期時間類型。

輸出窗口顯示結果,如圖2-22所示。

圖2-22 日期時間常量賦值給變量輸出顯示窗口

4. 十六進制常量

十六進制常量是計算機計數法中以十六進制計數的一種方式,由偶數個數組成,也就是數值型常量的另一種進制的特殊計數方式。十六進制數用單引號括起來,外面加字母X,這是十六進制的標志,如‘1F’X。

2.2.4 SAS操作符

SAS語言的操作符包括算術運算符、比較運算符、邏輯運算符和字符串連接符四大類。

1.算術運算符

算術運算符實現對數值型數據進行算術計算的功能,常用算術運算符見表2-1。

表2-1 常用算術運算符

【例2.16】求5的7次冪。

輸出窗口顯示輸出結果如圖2-23所示。

圖2-23 求5的7次冪輸出結果窗口

2.比較運算符

比較運算符實現比較運算功能,常用比較運算符見表2-2。

表2-2 常用比較運算符

【例2.17】運用比較運算符“>”,根據年齡查找出60歲及以上的老年人。

【程序解讀】

IF語句對年齡變量age通過比較運算符“>”來判斷年齡是否大于60歲,若是,則type=賦值為“老年人”,反之,則賦值為“其他”。

輸出結果如圖2-24所示。

圖2-24 查找大于60歲老年人輸出結果窗口

3.邏輯運算符

邏輯運算符實現邏輯運算功能。計算結果只有兩種值,真或假,如果邏輯值為真,返回計算結果為1,否則返回計算結果為0。常用邏輯運算符見表2-3。

表2-3 常用邏輯運算符

●AND或&。

【例2.18】x<y and y>0,如果x<y為真且y>0為真,結果為1;若有一個為假,結果就為0。

●| 或OR。

【例2.19】x<y|y>0,如果兩個關系中一個為真,結果為1;若全為假,則結果為0。

4.字符串連接符

字符串連接符實現連接兩個或多個字符串的功能。常用字符串連接符有||或?。 ?/p>

【例2.20】字符串連接符運用。

【程序解讀】

數據步中nect1變量為字符串變量con1與con2通過字符串連接符“||”實現字符變量的拼接;nect2變量為字符串變量con1與con2通過字符串連接符“!!”實現字符變量的拼接。對比這兩個字符串連接符可以看出,它們功能一樣,只是寫法不同而已。輸出窗口顯示如圖2-25所示。

圖2-25 字符串連接信息輸出顯示窗口

2.2.5 宏變量

宏變量與其他語言中定義的一個變量意義一樣,在程序的其他地方可以引用它,詳細內容見第9章。

定義宏變量語法如下。

【語法解讀】

●%LET:定義宏變量的關鍵字。

●宏變量名:任意起的變量名,要符合變量名定義規則。

●=賦值:可選項、可賦值、也可以通過其他語句賦值。

【注意】如果一個宏變量語句定義多個宏變量,宏變量之間用空格分隔。

【例2.21】定義一個不賦值宏變量。

【例2.22】定義一個賦值宏變量。

2.2.6 數組

數組(array)的定義為同一類型數據用同一方法處理的變量。

SAS中數組存儲的是變量,不是數據。數組只在數據步(DATA STEP)有效,數組的標號從“1”開始。

語法格式如下。

【語法解讀】

●ARRAY:定義數組的關鍵字。

●數組名:定義數組的名字。

●[m<,n>]:一維時,m表示數組元素的個數,無須寫n;二維時,m表示維數,n表示單一維度內的數組元素個數,可選項。

●<$>:可選項,數組為字符類型時才有此項。

●<數組變量列表>:可選項,變量名的列表。

【注意】三維和二維定義方式一樣。

【例2.23】定義一個一維數組。

輸出窗口顯示輸出結果如圖2-26所示。

圖2-26 一維數組輸出窗口

【例2.24】定義一個二維數組。

輸出窗口顯示輸出結果如圖2-27所示。

圖2-27 二維數組輸出窗口

【例2.25】定義一個二維臨時數組。

輸出窗口顯示y=G,如圖2-28所示。

圖2-28 二維臨時數組輸出窗口

2.2.7 選擇語句與循環語句

SAS語言的關鍵步就是對數據的處理,生成有效合理的數據集,便于其他模塊用來分析和利用,而生成數據集的質量關鍵在處理。數據步可以通過選擇語句和循環語句互相轉移控制語句來處理數據集。SAS語言的選擇語句和循環語句與其他語言的差不多。

1.選擇控制語句

(1)IF THEN語句

語法格式:

【語法解讀】

●IF:選擇語句關鍵字。

●條件表達式:可以取比較運算符組成的語句或邏輯運算符組成的語句。

●THEN:選擇語句關鍵字,條件表達式的條件成立則執行THEN語句后面的語句。

●<ELSE執行語句;>:可選項,如果條件表達式的條件不成立,有ELSE語句就執行ELSE語句后面的語句。

【例2.26】IF語句應用,根據信用卡數據查找出各類卡信息,并打印輸出A類信用卡的信息。

【程序解讀】

1)IF語句根據比較運算符組成的語句判斷,條件level='A'成立,執行THEN語句,把符合條件的數據通過OUTPUT語句輸出到數據集atype保存。

2)ELSE IF語句對比較運算符組成的語句判斷,條件level='B'成立,執行THEN語句,把符合條件的數據通過OUTPUT語句輸出到數據集btype。

3)對于IF語句與ELSE IF語句都不成立的,執行ELSE語句,通過OUTPUT語句把數據輸出到ctype數據集中。

輸出窗口顯示輸出結果,如圖2-29所示。

圖2-29 A類信用卡輸出顯示窗口

(2)IF條件表達式語句

語法格式:

【語法解讀】

比較運算符號組成的語句是比較條件判斷語句。其功能是對數據集過濾。

【例2.27】IF條件表件表達式語句應用,從數據集取4條記錄。

【程序解讀】

對SET語句中的數據集creditcard進行處理,通過IF語句引入SAS系統內部變量_N_,此變量值為數據步中讀取記錄條數的值,通過“小于”比較運算符號與5比較,如果_N_<5成立,就從數據集creditcard中取出符合條件的數據,存儲到數據集filter中。

輸出窗口顯示輸出結果,如圖2-30所示。

圖2-30 取數據集前4條信息輸出顯示窗口

(3)SELECT語句

語法格式:

【語法解讀】

●SELECT:語句關鍵字。

●查詢表達式:可選語句,一般為數據集中的一個變量。省略此項時,查詢條件在WHEN語句寫明。

●WHEN:語句關鍵字。

●OTHERWISE:可選語句,在上面情況都不成立時執行OTHERWISE語句中的語句。

●END:結束語。

【例2.28】SELECT語句應用,根據區號把區號字段修改成對應的城市。

【程序解讀】

SELECT語句中查詢id變量與WHEN語句中的值比較判斷,如果符合條件,就執行WHEN語句,否則執行OTHERWISE語句。

輸出窗口顯示輸出結果,如圖2-31所示。

圖2-31 SELECT選擇查詢信息輸出顯示窗口

【例2.28】中的程序可以改造為直接在WHEN語句中寫比較運算判斷條件,省略SELECT語句中的查詢條件。

具體程序如下。

【提示】這兩種SELECT語句寫法不同,但實現的功能相同,讀者用哪種方式都可以。

2.循環控制語句

(1)DO WHILE循環語句

語法格式:

【例2.29】求x自動加2的和。

【程序解讀】

循環條件是x<=7。當x=7時,x=x+2=9,此時返回到循環條件進行判斷,已經不符合條件,則循環結束。

輸出窗口顯示x=9,如圖2-32所示。

圖2-32 DO WHILE循環輸出顯示窗口

(2)DO UNTIL循環語句

語法格式:

【注意】DO UNTIL循環語句是先執行后判斷條件,條件成立輸出結果。

【例2.30】DO UNTIL循環語句應用。

輸出窗口顯示x=12。

(3)DO TO循環語句

語法格式:

【語法解讀】

BY每次增加量:BY語句中指定循環增量,省略此項時默認增量為1。

【例2.31】DO TO循環語句應用,每次y值加2。

【注意】DO TO循環語句需加OUTPUT來顯示數據,加END來結束循環。

2.2.8 格式修飾符

在處理數據的過程中,會遇到一些數據文件或數據塊中包含特殊字符的情況,對這樣的數據,在建立數據集讀取數據時,要在INPUT語句中對變量加格式修飾符。

(1)冒號(:)

從非空格開始讀取變量所對應的數據,直到滿足以下任意情況。

●遇到下一個空格。

●對應變量所定義的長度已經讀滿。

●數據行結束。

【提示】上面的三個情況只要滿足一個,該字段列讀取的數據就會結束。對字段列對應的數據長度大小不一的加冒號修飾符,可以正確讀取數據,防止錯讀列。

【例2.32】冒號格式修飾符應用,城市地址最長18個字符,請正確讀取下面的數據。

【程序解讀】

INPUT語句中定義的變量city所對應的變量類型前加冒號為:$30,表示此變量如果數據長度不夠遇到空格就結束讀取,如果超過此長度也結束,數據行結束也結束讀取。

輸出窗口顯示輸出結果,如圖2-33所示。

圖2-33 冒號修飾city讀取數據輸出顯示窗口

(2)取符號(&)格式修飾符

修飾所讀取為字符型的列數據中含有一個或一個以上空格的字符數據。SAS中默認空格為字段分隔符,要想保留空格,必須在定義的字符列加格式修飾符,而它后面列的數據必須以兩個或兩個以上的空格分隔。

【例2.33】取符號應用,讀取地址含空格的數據。

輸出窗口顯示輸出結果,如圖2-34所示。

圖2-34 取符號(&)修飾city讀取字符列數據輸出顯示窗口

(3)格式修飾符(~)

修飾所讀取對應列包含單引號、雙引號或分隔符的字符列。這樣的字符數據要加格式修飾符(~)。

【例2.34】格式符(~)應用,地址字段包含單引號和雙引號分隔。

【程序解讀】

INPUT語句中定義的變量city中加格式修飾符(~),此列對應數據有單引號和雙引號。

輸出窗口顯示輸出結果,如圖2-35所示。

圖2-35 格式符(~)修飾city讀取字符列數據輸出顯示窗口

2.2.9 指針控制讀取

SAS在讀取數據時也是通過SAS的指針控制符來控制讀取數據的。指針控制符分為行指針和列指針。下面分別講一下兩個指針控制符在數據處理中的應用。

1.列指針控制符

語法格式:

【語法解讀】

●@:列指針標識符號。

●n:整數類型,指明列的開始位置。

【例2.35】列指針控制符應用,讀取地區數據文件dq.txt,建立數據集diqu。

【程序解讀】

對外部文件分析,INPUT語句定義讀取位置和變量,@1表示變量id從第一列開始讀取數據,$2.指明變量id為字符類型,長度為2,讀取2個字符就結束。其他變量定義形式與變量id類似。

輸出窗口顯示輸出結果,如圖2-36所示。

圖2-36 列指針讀取外部數據輸出顯示窗口

2.列控制符號

語法格式:

【語法解讀】

●N1:列開始位置,正整數值。

●N2:列結束位置,正整數值。

【例2.36】列控制符號應用,讀取數據文件dq.txt,建立數據集diqu2。

【程序解讀】

INPUT語句中定義的變量id數據類型為字符類型,1-2指明此變量對應的數據從數據文件中的第一列開始,到第二列結束。其他變量分析方式和變量id類似。

【提示】對相同數據文件通過兩種不同的列控制符號讀取數據,程序運行后輸出結果相同,讀者可根據個人喜好具體選擇。

3.單個@符號應用

INPUT語句中單個“@”行控制符號可以讓指針控制在當前行,當遇到下一個INPUT時行指針才移動。

【提示】對數據塊或數據文件進行過濾時經常用到。

【例2.37】單個@符號應用,將數據文件中的女性信息取出,建立數據集。

【程序解讀】

語句input@1 gender$1.@表示先讀取gender變量的數據,然后通過if gender="F"語句判斷,符合條件就繼續執行下面的input語句。

輸出窗口顯示輸出結果,如圖2-37所示。

圖2-37 讀取女性信息輸出顯示窗口

4.@@符號控制讀取

INPUT語句在讀取數據文件或數據塊中的數據時,若多條觀測記錄集中在一行,為使INPUT語句讀取完整,運用“@@”行控制符強制SAS向右讀取,并按對應列讀取數據。

【例2.38】@@符號讀取控制應用,讀取手機信息,建立數據集iphone。

【程序解讀】

cards語句中的觀測數據集中在一行,因此通過@@控制符使SAS按input語句指定的變量順序向右繼續讀取。

輸出窗口顯示輸出結果,如圖2-38所示。

圖2-38 行控制符“@@”信息輸出顯示窗口

2.2.10 INPUT語句

SAS數據步的建立離不開INPUT語句,在讀入外部數據文件或CARDS語句后面的數據塊時,需要通過INPUT語句定義變量,并把對應的數據賦值給各自的變量。

通過上面的解釋可以看到INPUT語句的用途主要是:

1)讀取外部數據文件或CARDS語句后面的數據塊。

2)INPUT語句里可以定義變量。

語法格式:

【語法解讀】

●INPUT:關鍵字,INPUT語句中定義變量名、變量類型,并可以指定列格式。

●變量名:用戶定義的變量名要符合SAS命名規則。

●輸入格式:如果變量是字符型的就加符號“$”告訴SAS此變量為字符型;w.d:w定義變量總長度,如果數值型變量有小數,d指明變量的小數位數。

【注意】變量之間用空格分隔。

INPUT語句中對變量定義的四種格式如下。

●只列出變量名,變量之間以空格分隔。只是字符型的變量加個“$”符號。數值型的只寫出變量名。

這種格式的優點是簡單;缺點是不能輸入帶空格的數據,輸入的數據嚴格按變量對應的數據輸入,SAS默認讀取最多8個字節(1中文占2字節)。

●對變量名用列格式定義對應的數據,變量名后用數字指明變量對應的數據在數據行中的列位置。字符類型的變量加“$”符號。

這種格式的優點是只需要標明列號就可以使變量讀取到對應的數據。字符型的變量可以包含空格。字符型的數據可以讀取到最大200個字符;缺點是變量對應的數據輸入時要嚴格按照列格式對應列輸入。

●變量名后面直接定義輸入類型的格式,定義變量的長度和數據類型。

這種格式的優點是輸入的數據不需要空格分隔;缺點是輸入的數據要嚴格按列對齊。

●絕對指針方式讀入輸入變量對應的數據。

這種格式的優點是可以指針取值,控制靈活;缺點是需要把變量對應數據列的起始位置計算出來。

為便于理解上面所講的INPUT語句讀取變量數據的三種數據格式,下面通過實例分別講解。

(1)列變量名方式讀取數據

【例2.39】根據商品信息建立數據集jg。

【程序解讀】

INPUT語句中定義的變量id、name和price沒有指針控制,數據塊按變量順序賦值給變量。

輸出窗口顯示輸出結果,如圖2-39所示。

圖2-39 列變量名方式讀取商品信息輸出窗口

(2)對變量名用列格式定義

【例2.40】根據個人手機信息建立數據集iphone。

【程序解讀】

INPUT語句中定義的變量指定了列的開始位置和結束位置,嚴格按照數據對應列讀取。

輸出窗口顯示輸出結果,如圖2-40所示。

圖2-40 列格式方式讀取個人手機信息輸出窗口

(3)變量名后面直接定義輸入類型的格式

【例2.41】根據個人手機信息建立數據集iphone2。

【程序解讀】

INPUT語句中定義的變量直接定義變量類型和長度,控制讀取數據。

輸出窗口顯示輸出結果,如圖2-41所示。

圖2-41 變量名后面直接定義輸入類型讀取個人手機信息輸出窗口

(4)絕對指針方式讀入輸入變量

【例2.42】根據個人手機信息數據建立數據集iphone3。

【程序解讀】

INPUT語句中通過@指針定義每一個變量的開始位置,并定義變量類型和長度。

輸出窗口顯示輸出結果,如圖2-42所示。

圖2-42 絕對指針方式讀入個人手機信息輸出窗口

【提示】通過上面的幾個實例可以看出,這幾種讀入數據的方式各有利弊,需要根據具體情況來定,特殊的數據或數據文件需要根據需求選擇讀取方式。

2.2.11 INFILE讀取文件

SAS數據步的建立依靠的是數據,獲取數據就需要INFILE語句告訴SAS系統外部數據文件存儲在什么位置。INFILE語句有時和FILENAME語句配合使用。FILENAME用來指定文件路徑所對應的邏輯名,就相當于給一個人起的別名,物理位置是后面的文件路徑。

(1)INFILE讀取外部文件的設置

語法格式:

【語法解讀】

●FILE-SPECIFICATION:指明物理文件路徑。

●TYPE:指明文件類型,默認是一個標準類型的外部文件。非標準文件類型要在這里指定。可以取的類型有DLI、HFS、PIPE、IDMS、ISAM、VSAM、VTOC等。這幾個類型各自對應不同的操作系統,HFS對應UNIX操作系統,MVS對應Z/OS操作系統。

●OPTIONS:指明主機中對應外部文件的選項,文件讀取時經常用到的標準選項,下面對常用選項講解一下。

對于文件中每條記錄長度不定,且對應列數據有缺失值的文件,根據具體文件具體分析,需要對下面幾個參數進行設置來控制文件讀取。

◆FLOWOVER:是FLOW和OVER兩個單詞的組合,FLOW翻譯成中文是流動,也就是一直流動下去,直到數據文件結束。這是SAS的默認選項,如果讀取的文件中不指明選項,默認就是FLOWOVER。它告訴SAS在讀取外部數據文件時,當前數據行如果記錄長度和INPUT語句所聲明的列對應數據長度不夠,SAS系統就從下一行記錄讀取數據來滿足列對應的數據。SAS是先把數據讀到緩沖區。

◆MISSOVER:通過MISS可以知道這個選項就是對缺失數據列的數據處理。SAS系統在讀取數據行時,如果讀到當前數據行長度到當前列沒有達到INPUT語句聲明的列長,SAS系統會通過這個參數設置來告訴系統從當前列開始之后所有的列為缺失值,缺失值SAS默認用點(·)表示。不從下一行讀取。

◆TRUNCOVER:TRUNCATE OVER的組合,從英文單詞就可以知道此參數設置是告訴SAS系統在讀取數據文件時,如果對應列當前讀到的數據行長度不夠INPUT語句聲明中定義的列長,就把此列當前對應的數據截取出來給此列。如果讀取到的數據行是最后一條記錄,且當前列也沒有數據值,那么從此列和此列之后的都賦值給缺失值,用點(·)表示。

◆STOPOVER:由STOP和OVER兩個單詞組合而成,翻譯成中文是停止結束的意思。如果在數據文件讀取時INFILE里面設置了這個選項,就是告訴SAS系統在讀取數據文件時如果讀取到的當前數據行的長度不能滿足INPUT語句中聲明的列長度,SAS就停止讀取后面的數據,直接以當前已經讀取的符合INPUT語句中定義列標準的數據建立數據集。

◆LRECL=:正整數的值,告訴SAS系統中的INFILE所讀取的外部文件的邏輯記錄長度,它依靠記錄格式(RECFM=VALUE)來定,默認是256個字節。文件記錄長度超過這個長度要在LRECL指定文件長度,最大是32767。

◆RECFM=:指定文件數據格式(RECORD-FORMAT,RECFM),取值從下面指定的值中選擇對應文件匹配的格式:

F表示數據文件數據塊不固定,每條記錄值的長度固定;V表示數據文件數據塊不固定,記錄變長;FB表示數據文件中數據塊固定,每條記錄值的長度固定;VB表示數據文件中數據塊固定,記錄變長;U表示數據文件中數據塊不固定,記錄變長。

◆FIRSTOBS與OBS參數:FIRSTOBS是由FIRST和OBSERVATION這兩個單詞組合而成的,意思是告訴SAS系統當前讀取的數據文件或數據塊從哪條數據行記錄開始讀取數據文件或數據塊,取值為正整數;OBS是OBSERVATION單詞的縮寫,是觀察記錄的意思,用來告訴SAS系統讀取當前數據文件或數據塊到第幾行記錄結束。

還有很多參數設置選項,這里就不一一解釋了,用時可查閱SAS的幫助文檔。

下面舉幾個實例來幫助讀者理解參數的設置。讀者也可以自己設計一個數據文件,把上面講的幾個參數靈活運用一下,看數據集的建立會有什么變化,通過對比數據集的變量所對應值的差異來深刻理解參數的設置。

【例2.43】讀取個人基本信息數據文件,數據文件物理位置存儲在“d:\sastest\yxy\grxx.dat”,建立個人信息數據集individual_inf。

【程序解讀】

INFILE中指定選項missover對缺失值處理,以點(.)表示,由于讀取的外部文件長度超過默認長度256,必須用選項lrecl=指定,此文件中lrecl=270表示文件一行記錄長度為270字節。

【提示】通過此程序要學會根據文件的不同來判斷用INFILE讀取數據文件的哪些參數,具體參數設置要學會查SAS幫助,由于INFILE里面的參數太多,此處不能一一講解。這個程序只是其中的一類,文件長度超過了默認文件長度256,要用LRECL=指定文件長度。否則后面的文件會被截斷。

下面把【例2.43】程序中的LRECL=參數去掉,運行程序后日志顯示窗口如圖2-43所示。

圖2-43 LRECL參數去掉后日志顯示窗口

日志顯示最大記錄長度是256,超過長度256的列所對應的數據被截斷。

【例2.44】生產服務器上有一個超過兩億條的數據文件,數據文件存儲物理位置為“d:\sastest\yxy\sy.dat”,為了提高程序讀取文件的并發性和效率,決定把此文件分三個SAS程序同時讀取數據。第一個SAS程序從數據文件的第一條記錄讀取,讀取記錄條數為3000條;第二個SAS程序從數據文件的3001條讀取,讀取到記錄條數為7000時結束;第三個SAS程序從數據文件的第7001條記錄開始讀取,直到文件讀取結束。

說明:為便于給大家運行程序,只是假定了這樣設置,實際生產對數據文件的拆分是要平衡記錄條數的。

程序如下。

program1:從數據文件的第一條記錄讀取,讀取記錄條數為3000條。

日志信息窗口如圖2-44所示。

圖2-44 program1讀取數據文件日志信息窗口

program 2:從數據文件的3001條讀取,讀取記錄條數為4000條。

日志信息窗口如圖2-45所示。

圖2-45 program2讀取數據文件日志信息窗口

program 3:從數據文件的7001條讀取,直到數據文件結束(說明:實例中的數據文件總記錄條數為8366)。

日志信息窗口如圖2-46所示。

圖2-46 program3讀取數據文件日志信息窗口

通過上面三個SAS程序對FIRSTOBS和OBS實際運用的舉例,已經很清楚地了解了這兩個參數的運用方法。還有很多其他參數,這里不再一一列舉。

(2)INFILE與FILENAME一起運用,讀取外部文件

FILENAME起到了定義外部文件邏輯路徑名的作用。

【例2.45】讀取外部文件地區信息數據文件,文件存儲位置:”d:\dzwj\diqu.dat”,建立數據集diqu。

(3)INFILE后面直接跟文件路徑

使用該方式不利于程序的修改和可讀性。一般不提倡用此方式。

【例2.46】把上面的【例2.45】程序修改成INFILE后面直接跟路徑名的方式讀取外部文件,建立數據集diquzj。

通過上面對INFILE語句的應用舉例,要學會舉一反三,靈活運用,具體問題具體分析。在對SAS達到一個很好的認識后,要學會運用SAS自帶的幫助文件來了解每一個參數。因為任何書籍的講解都不可能完全把所用的內容都寫出來,而只是把SAS編程的思想和思路告訴讀者。運用好SAS自帶的幫助文件可以更深入地運用SAS,提高程序效率。

2.2.12 DELIMITER應用

DELIMITER翻譯成中文是定界符、分隔符的意思,通過這個單詞可以知道SAS用這個語法來處理數據文件或數據塊數據之間用分隔符分隔的數據。SAS系統默認數據文件或數據塊數據之間以空格分隔,如果所給數據文件或數據塊數據之間是以空格分隔的,就可以省略這個參數。通過DELIMITER告訴SAS系統數據文件或數據塊數據之間碰到分隔符為一個間隔列,這樣就可以把數據賦值給INPUT語句中定義的列變量中。SAS語法引用時可以簡寫成DLM。

語法如下。

【例2.47】電信信息部每月信息數據以“,”逗號分隔符存儲數據到指定的目錄。數據文件存儲位置'd:\dzwj\elec.dat'。數據文件格式dat格式。請以此數據文件建立數據集sj。

【程序解讀】

INFILE語句中讀取數據文件之間有分隔符號的數據通過dlm=’,’告訴SAS系統每列以分隔符號表示變量對應數據結束。

輸出窗口顯示輸出結果,如圖2-47所示。

圖2-47 DELIMITER參數應用讀取外部數據文件輸出窗口

【例2.48】讀入CARDS數據塊的數據,數據分隔符號'!',建立數據集lu。

輸出窗口顯示輸出結果,如圖2-48所示。

圖2-48 DELIMITER參數應用讀取CARDS數據塊輸出窗口

【提示】如果分隔符是Windows操作系統的制表符號,單引號外要加x。如DLM=’09’x。這個x告訴SAS系統是Windows操作系統。如果是其他操作系統就查系統標識。常用的數據文件或數據塊中數據間的分隔符有'|'、'!'、','。

2.2.13 日期與時間

SAS中的數據類型就兩種,字符型和數值型。SAS將日期和時間轉換成數值型來存儲。由于SAS是1960年發布的語言,于是就人為約定1960年1月1日為SAS的開始日期,并作為基準日期,把此日期定義為零(0)這個數值類型存儲在SAS中,其他日期的數值是通過與1960年1月1日之間的間隔天數來進行計算的,例如2019年3月4日被SAS定義為(21612)。1960年1月1日之前的存儲為負值。相當于在日期之間做減法運算來求天數。時間的存儲值也是從零(0)時開始,以秒為單位進行計算。

假定當前日期為yyyy年m月n日,則天數的計算公式=(yyyy-1)年的天數+…+1960年的天數+當前1月份天數+當前2月份天數+…+(m-1)月份的天數+(n-1)的天數。

【例2.49】當前日期為1960年1月3日,在SAS中存儲的天數=(1960-1960)年的天數+(1-1)月份天數+(3-1)=2。

SAS在讀入日期和時間時有自己定義的日期和時間格式,在對外輸出時也有自己定義的輸出日期和時間格式,這是SAS的特殊之處。為便于理解,通過舉例來進一步講解SAS日期和時間,以及它們的應用。

(1)讀入日期格式

●DATEw。

【語法解讀】

DATE是日期關鍵字,w用來指定日期長度,默認是7,超過7的長度要定義。讀入的日期書寫格式為ddmmmyy或ddmmmyyyy(dd指的是所在月的某一天,取值為01~31的某一天,mmm指用英文書寫的月份的前三個字母,yy指的是兩位表示的年份,yyyy指的是四位表示的年份)。

【例2.50】讀入學生入學信息,建立數據集xs。

輸出窗口顯示輸出結果,如圖2-49所示。

圖2-49 學生入學信息輸出窗口

●DATETIMEw.d。

【語法解讀】

DATETIME是定義讀入日期時間格式的關鍵字,w為指定日期時間長度,w值要取偶數,默認是16,d小數位用來指定秒的值,注意d的值要比w值小。

【例2.51】讀入支付寶交易時間,建立數據集zfb。

輸出窗口顯示輸出結果,如圖2-50所示。

圖2-50 交易時間輸出窗口

●JULIANw。

【語法解讀】

JULIAN是日期關鍵字,w是定義的日期長度,默認是5。讀入日期書寫格式為yydd或yyyyddd。yy和yyyy分別代表讀入的兩位和四位的年份。ddd是從年初到當前日期之間的天數,范圍為01~365的值。

【例2.52】2011年1月10日,用JULIANw.表示則為2011010。

其他讀入日期和時間的格式如下。

DDMMYYw.:讀入ddmmyy格式輸入的日期,如160811,16/12/10等。

MMDDYYw.:讀入mddyy格式輸入的日期。

YYMMDDw.:讀入yymmdd格式輸入的日期。

TIMEw.d:讀入hh:mm:ss.ss格式輸入的日期,如11:36:48.6。

上面這些讀入日期時間格式,要根據讀入的日期書寫形式來定義日期格式,具體問題具體分析。

(2)輸出日期格式

SAS系統在對輸出日期格式方面有更多設置,和讀入日期時間的格式一樣,輸出日期格式有很多,這里舉幾個常用的輸出日期格式,具體有DATEw.、DATETIMEw.d、DAYw.、MONTHw.、YEARw.等。還有很多,用到其他日期時可以查SAS幫助文檔。

2.2.14 INFORMAT和FORMAT讀取數據定義格式

在向SAS輸入數據時,很多時候會發現SAS并沒有正確理解數據所代表的含義。例如,輸入20191001時,SAS會把它讀為“兩千零一十九萬一千零一”,這是因為沒有定義數據的輸入格式,當定義輸入格式為日期后,SAS就會把它讀為“2019年10月1日”;輸出格式是讓SAS按照相應的格式將數據顯示給我們。例如,數值型變量x=20,如果指定x的輸出格式為“5.2”,SAS就會把x顯示為“20.00”。

●INFORMAT:讀入數據時,在數據步里對變量定義輸入格式。

語法格式:

【例2.53】INFORMAT語句應用,根據人口流動信息建立數據集dz。

【程序解讀】

INFORMAT語句定義變量dz并指定數據類型格式為mmddyy10.。

輸出窗口顯示輸出結果,如圖2-51所示。

圖2-51 人口流動信息輸出窗口

●FORMAT:對于輸出的數據格式進行定義,和INFORMAT相反,但定義方式一樣。

語法格式:

【例2.54】FORMAT格式應用,根據住房信息匯總建立數據集house。

【程序解讀】

FORMAT格式指定變量start的輸出格式為yymmdd10.。

輸出窗口顯示輸出結果,如圖2-52所示。

圖2-52 住房信息輸出窗口

【提示】通過上面的兩個舉例可以很深刻地了解INFORMAT和FORMAT的應用。FORAMT在數據步和PRINT過程步都可以應用。

2.2.15 LENGTH應用

SAS語言對定義的變量有個默認大小,默認變量的長度為8個字節,超過8個字節長度就要首先用LENGTH語句來定義變量,并指定長度。

語法格式:

【語法解讀】

LENGTH是關鍵字,如果變量是字符類型的,定義變量類型前面加“$”符號。

【注意】LENGTH語句與INPUT語句一起使用時就必須把LENGTH語句放在INPUT語句前面,INPUT語句中引用LENGTH語句定義的變量時無須再次定義,直接引用變量名即可。

【例2.55】LENGTH語句應用,根據大學生體檢數據,建立數據集health。

【程序解讀】

LENGTH語句定義變量health的變量類型和長度,INPUT語句可以直接引入此變量。

輸出窗口顯示輸出結果,如圖2-53所示。

圖2-53 大學生體檢數據輸出窗口

2.2.16 LABEL定義變量標簽

為便于理解變量的含義,SAS語言中用LABEL語句給變量定義描述信息標識。描述信息和變量名一塊被存儲到數據集中。

語法:

【語法解讀】

●LABEL:定義變量標簽的關鍵字。

●變量描述信息:最多40個字符。

【例2.56】LABEL語句應用,根據公司員工信息建立數據集employ。

【程序解讀】

LABEL語句對INPUT語句中定義的變量指定描述性信息,便于用戶理解每個變量代表什么意義。

輸出窗口顯示輸出結果,如圖2-54所示。

圖2-54 公司員工信息輸出窗口

【注意】調用PRINT過程時打印標簽信息必須加LABEL選項。

2.2.17 FILE寫數據到外部文件

INFILE語句和FILE語句可以說是一對,只是在功能方面有所不同,INFILE語句是讀外部數據文件或數據塊,而FILE語句是把數據寫到指定目錄的數據文件。FILE語句把PUT語句后面指定的變量所對應的數據輸出到指定文件,要和PUT一起使用。

語法格式:

【語法解讀】

1)指定文件名:可以取的選項如下。

●指定要寫入外部文件的文件名。這里可以直接寫完整路徑下的文件名。

●可以寫宏變量名,宏變量指定外部文件的完整路徑。

●可以寫到SAS日志窗口,取LOG選項即可。

●可以寫到SAS的OUTPUT窗口,取PRINT選項即可。

2)<ENCODING=’指定編碼’>:是可選項,指定要寫入的文件編碼,告訴SAS寫入的文件是什么編碼。如是COBOL語言寫的EBCDIC編碼,則ASCIIANY編碼是ASCII編碼。還有很多編碼,用到時可以查看SAS幫助,讀者可以根據寫的文件要求的編碼來取編碼值。

3)<文件選項>:是可選項,寫入文件的控制選項比較多,這里把經常用到的幾個文件選項系統講解一下,其他用到的選項可以查SAS幫助文檔。常用文件選項如下。

●BLKSIZE=:指定寫入的文件大小。

●LRECL=:正整數的值,告訴SAS系統中的INFILE所寫入的外部文件的邏輯記錄長度,它依靠記錄格式(RECFM=VALUE)來定,默認是256個字節。文件記錄長度超過這個長度要在LRECL指定文件長度,最大是32767。

●RECFM=:文件的數據格式(RECORD-FORMAT,RECFM),取值從下面指定的值中選擇對應文件匹配的格式。

◆F:數據文件數據塊不固定,每條記錄值的長度固定。

◆V:數據文件數據塊不固定,記錄變長。

◆FB:數據文件中數據塊固定,每條記錄值的長度固定。

◆VB:數據文件中數據塊固定,記錄變長。

◆U:數據文件中數據塊不固定,記錄變長。

●DROPOVER:由DROP和OVER兩個單詞組成,意思是把數據寫入文件,如果超出規定的數據行的長度,就不要了,丟失它。

●FLOWOVER:由FLOW和OVER兩個單詞組成,FLOW是流動的意思,也就是一直流動直到行記錄寫完。這是SAS的默認選項,如果寫入的文件中不指明選項,默認就是FLOWOVER,它告訴SAS系統在寫入數據外部文件時當前數據行如果記錄長度超過規定的行記錄長度,就把超出的行記錄寫到下一行。

●DSD:由Delimiter、Sensitive、Data三個單詞取各自取首字母組合而成,意為敏感數據分隔。這個選項用來告訴SAS系統數據包含嵌入的符號,如制表符號或逗號分隔符號,用引號括起來的值。這樣分隔符號就可以包含在數據中寫入文件。指定DSD選項后默認分隔符是個逗號。

●MOD:在現有的內容后面追加新的內容。如果不加這個參數,則默認是OLD格式。

4)<主機選項>:可選項,是在UNIX操作系統環境下的選項。但有幾個選項在Windows操作系統環境下也用(如LRECL=和RECFM=)。下面把主要的選項講解一下,其他主機選項用到時查SAS幫助文檔即可。

●BLKSIZE=或寫成BLK=:指定寫入文件的字節數,默認是8KB,最大1GB。

●NEW|OLD:告訴SAS系統是打開的新的文件作為輸出,如果文件名存在,把這個存在文件刪除并重建。這是個默認的選項動作。

●UNBUF:是告訴SAS系統不要把緩沖區數據寫入文件。此選項特別適用于在編寫的數據收集程序中,用來限制緩沖區數據寫入文件。

上面把FILE選項詳細地進行了講解,為便于深刻理解和運用FILE語句,下面舉幾個實例。

【例2.57】FILE語句應用,學生信息寫入'd:\sastest\yxy\student.txt'文件中,列之間用’|’分隔數據。

【注意】一個中文字符占兩個字節,要注意@n標的是每個列的開始位置。用UltraEdit這個工具可以看到每個列的開始位置。輸出分隔符占一列,要計算在內。

日志內容顯示如圖2-55所示。

圖2-55 學生信息寫入到文件日志信息窗口

【例2.58】電信信息管理部的ORACLE數據庫里有電信手機用戶信息數據表mobile,現在要把此表里的數據寫入'd:\sastest\yxy\mobile.dat'目錄下的文件里,以分隔符’|’分隔數據列。

實施步驟如下。

1)先在ORACLE數據庫里把下面的建表語句輸入。

2)在ORACLE數據庫里執行插入語句到表中。

3)在SAS編輯窗口執行下面的SAS程序。

【提示】user表示登錄數據庫的用戶名,password表示登錄數據庫的密碼,path表示登錄的數據庫。要把LIBNAME語句的這三項改成自己的數據庫信息。

%LET out='d:\dzwj\mobile.dat'語句中的路徑“d:\sastest\yxy”要先建好,mobile.dat不用建,執行后會生成此文件。

【程序解讀】

日志內容顯示可以看到FILE在寫入外部文件時如果行記錄長度超過256,要用LRECL=參數指定,如果不超過這個長度可以省略此參數。

2.2.18 RETAIN語句

SAS對變量賦初始值是通過RETAIN語句進行的,SAS在讀入原始數據時,開始時所有的變量為缺失值,如果想對某個變量一開始就給予其某個值,可以用RETAIN語句定義并在語句中給予變量初始值。

語法格式:

【語法解讀】

●RETAIN:關鍵字。

●變量名:要賦值的變量。

●初始值:具體數值。

【例2.59】RETAIN語句應用,求y=x+3的和,x初始值為7。

輸出窗口顯示輸出結果,如圖2-56所示。

圖2-56 RETAIN賦初始值給x變量顯示窗口

2.2.19 RENAME語句

SAS語言對定義的變量修改名字是通過RENAME語句進行的。

語法格式:

【語法解讀】

●RENAME:是關鍵字。

【例2.60】RENAME語句應用,把學生成績數據集中的變量名score修改為math。

【程序解讀】

RENAME語句修改變量score為math。

輸出窗口顯示輸出結果,如圖2-57所示。

圖2-57 RENAME語句修改變量score為math顯示窗口

2.2.20 SAS編程注釋語句

為了提高程序的可讀性,便于其他人更好地理解程序的功能和用途,對程序添加注釋是必不可少的。

SAS添加注釋的方式有兩種方式:

(1)* 注釋語句 ;

【注意】以*(星號)開始,中間寫注釋語句,以“;”(分號)結束。這里的分號要在輸入法為英文的狀態下輸入,和程序中用到的分號一樣。

(2)/* 注釋語句 */

【注意】以“/*”開始,中間寫注釋語句,以“*/”結束。

主站蜘蛛池模板: 曲松县| 远安县| 霍林郭勒市| 峡江县| 社旗县| 曲松县| 韩城市| 贡觉县| 望城县| 桦甸市| 根河市| 福贡县| 方城县| 图木舒克市| 江口县| 神农架林区| 鞍山市| 巴青县| 海林市| 林州市| 高台县| 长海县| 通山县| 乌兰县| 鹰潭市| 纳雍县| 东乡族自治县| 澜沧| 浦江县| 宜春市| 三门峡市| 铜陵市| 恩平市| 宁河县| 堆龙德庆县| 岱山县| 松溪县| 凤阳县| 太湖县| 江都市| 青州市|