熱線電話:13121318867

登錄
首頁精彩閱讀SAS程序錯誤及處理
SAS程序錯誤及處理
2017-03-30
收藏

SAS程序錯誤及處理

通常我們所開發的SAS程序,很少在第一次提交時就能夠運行完成并產生正確結果。程序越長越復雜,就越可能出現語法或邏輯錯誤。本文介紹了一些良好的SAS編程規范以減少程序錯誤,同時也描述了幾種常見的錯誤及錯誤發生后對應的處理方法。

良好的SAS編程風格

在開發SAS程序的過程中,遵循下面幾條規則可以使程序出錯的幾率變小,并幫助發現錯誤。

(1)提高程序的易讀性

一個簡單的方式是在開發程序時保持代碼的整潔和一致。易讀的程序會更易于調試,長期來看會節省時間。在編寫SAS程序時可遵循如下建議以提高程序的易讀性:

每行一條SAS語句。SAS允許在一行寫多個SAS語句,這樣會節省代碼空間,但是這些空間會以損失程序的易讀性為代價。


(2)測試程序每個部分

在開始寫下一部分的代碼之前,先測試前面已經完成的代碼,保證已經完成的代碼運行正確會極大地提高開發效率。

如果是從外部數據文件讀取數據到SAS數據集,則使用PROC PRINT打印SAS數據集或數據集的部分數據,以保證該數據集被正確生成。有時,在日志中可能沒有錯誤或可疑的提示,而所生成的數據集卻是不正確的。這是因為所開發的代碼可能并沒有如預期的讀取數據,或原始數據本身存在某些在開發代碼時沒有意識到的問題。對此,好的習慣是,對程序創建的所有SAS數據集都至少要打印一次,以進行檢查。

(3)正式運行程序前使用較小的數據集測試程序

有時,使用全部數據測試程序是不現實的。如果數據文件特別大,測試所有的數據會很費時,這時可以使用數據的子集來進行測試。

如果是從文件中讀取數據,可以在INFILE語句中使用OBS=告訴SAS讀取文件中的前多少行,例如前50、前100行或更多,只要能代表要讀取的數據就行。下面的代碼僅僅讀取文件的前100行:

還可以使用選項FIRSTOBS=指定從文件的中間部分開始讀取數據。例如,下面的語句讀取customer.dat文件的第101行到第200行:

同樣選項FIRSTOBS=和OBS=也可以用于在SET語句中讀取該數據集中對應的觀測。下面的代碼會讀取數據集saslib.customer中的第101到第200個觀測。

關于SET語句及數據集選項,下面文章會詳細介紹。

(4)使用語法敏感的編輯器

在Windows操作系統下,增強型編輯器(Enhanced Editor)是默認的編輯器,在其他操作系統下,程序編輯器(Program Editor)是默認編輯器。這兩種編輯器都會對代碼的不同部分自動添加顏色,例如SAS關鍵字是一種顏色,變量是另一種顏色。此外,所有引號中的文本也是同樣的顏色,這樣我們可以很容易區分是否存在引號不匹配的情況。類似地,遺漏分號也很容易發現,因為分號遺漏可能會導致接下來的代碼顏色不正確。

常見錯誤及處理

SAS程序提交執行后會在日志窗口或日志文件中產生代碼運行的信息。我們可以根據日志信息確定什么時候程序發生錯誤,并獲取信息糾正錯誤。SAS通常會識別四類錯誤:

SAS檢測到錯誤時,通常會將錯誤或檢測到錯誤的位置加下劃線,并顯示一個數字。每個數字與一條錯誤消息唯一關聯。接著SAS進入語法檢查模式,它會讀取剩下的程序語句、檢查語法,并在其他錯誤位置加下劃線。

在批處理或非交互式的程序中,DATA步中的錯誤會導致SAS對剩下的程序一直處于語法檢查模式,其他任何創建外部文件或SAS數據集的DATA或PROC步都不會執行。然而,讀SAS數據集的過程會執行,但是讀入的觀測數會為0,而不讀SAS數據集的過程正常執行。通常PROC步中的語法錯誤僅僅影響當前PROC步。在該PROC步結束時,SAS會將檢測到的每個錯誤寫入SAS日志。

語法錯誤

有些語法錯誤從日志窗口中很容易理解并改正,有時SAS還會自動糾正并提示警告信息,例如在圖2.50中展示的是關鍵字拼寫錯誤。關鍵字INPUT錯誤拼寫為INYUT,SAS給出警告信息并將該拼錯的詞理解為INPUT。這樣,編譯會通過,代碼也會正確執行。但SAS并不負責將代碼中的錯誤改正,需要開發人員自己修正。

圖2.50 關鍵字拼寫錯誤

很多語法錯誤是由于遺漏分號(;)導致的,根據其在日志窗口的消息,可能沒那么容易找到出錯原因。在下面的代碼中,DATA語句指定了數據集名稱之后遺漏分號(;)。

提交代碼執行時,因為遺漏分號,SAS認為DATA語句中沒有結束,length和Name都被當作數據集名。SAS無法解釋接下來出現的$,所以認為出錯。SAS在日志中顯示了如圖2.51所示的信息:在$出現的地方加劃線,并給出期待在這個地方出現的名稱或符號,并提示出錯。

圖2.51 遺漏分號

這時需要通過在DATA語句數據集名稱之后添加分號(;)來修正該段代碼。

數據錯誤

在下面的程序中,INPUT語句使用列表方式讀取數據值。要讀取的最后一個變量為數字型變量,但輸入數據中第三行記錄的最后一個字段為字符。

提交執行后查看日志窗口信息,如圖2.52所示。SAS提示在第10~13列(因為是列表輸入方式,所以要賦值給Price的是“five”,對應于第10~13列)的數據對變量Price無效。為了便于分析和修正,SAS還在日志窗口列出了輸入緩沖區的值、PDV中各變量的值,包括DATA步中定義的變量和自動變量_ERROR_和_N_等。該數據錯誤只是會導致所生成的觀測中存在缺失值,DATA步并不會停止執行。

圖2.52 數據錯誤

對于這樣的問題,有多種處理方式。在本例中可以不作處理,因為它只是會導致觀測中存在缺失值。其他類似的情況,可以通過調整輸入方式,例如使用格式化輸入等方法來解決。

語義錯誤

在下面的程序中,DATA步讀取外部數據文件,并指定文件中字段值之間的分隔符為逗號(,)。注意,其中INFILE語句的選項DLM=誤寫為DLMA=了。

提交程序執行后查看日志窗口的信息,如圖2.53所示。SAS提示選項名稱DLMA無效。因為出錯,SAS停止處理并創建沒有觀測值的數據集。

圖2.53 語義錯誤

這時需要更正該選項名稱為DLM=,并再次提交執行。

引號不配對

在執行SAS程序時,有時會出現比較意外的情況。例如提交了代碼后,并不產生任何結果,日志窗口僅顯示代碼信息,沒有對應的SAS語句執行提示信息。不知道SAS在干什么,有時編輯器窗口會一直表示PROC步正在運行。這時首先需要檢查是不是存在代碼中引號不配對的問題。

在下面的代碼中,FILNAME語句指定文件引用時,文件名結束后遺漏了對應的單引號(")。

提交代碼執行,并查看日志窗口,有原始代碼,但沒有語句執行提示信息,如圖2.54所示。

圖2.54 SAS程序運行不結束

遇到的這樣的問題,建議先提交下列代碼將引號配對,從而使程序完成執行過程,再來檢查修正程序的錯誤。這三行代碼除了可以解決不匹配的單引號和雙引號外,還可以解決不匹配的注釋標記,以及遺漏分號、QUIT或RUN語句的問題:

結語

“讀取外部數據到SAS數據集”系列文章首先介紹了SAS編程的基本概念,具體包括SAS邏輯庫、SAS數據集、SAS數據集管理、系統選項以及SAS程序結構等內容;在此基礎上介紹了DATA步處理數據的原理,重點講解了如何使用DATA步的各種輸入方式來讀取不同格式的外部文件中的數據,并創建數據集;接下來介紹了如何運用IMPORT過程讀取外部的數據文件,以及如何通過LIBNAME語句和PROC SQL訪問關系型數據集庫系統中的數據;最后,還介紹了SAS程序開發中常見的幾種錯誤現象及其處理方法。

程序的不同部分使用相應的縮進??s進DATA步和PROC步中的所有語句,這種方式會很容易得知程序中有多少個DATA和PROC步,并且知道那些語句屬于哪個過程步。

代碼中引用的所有SAS文件都使用二級名稱,例如work.customer,即使該SAS文件存儲在WORK臨時邏輯庫或USER邏輯庫中。

使用RUN或QUIT語句顯式地表明DATA步或PROC步結束。雖然SAS會在遇到下一個DATA步或PROC步時自動認為當前過程步結束,但是RUN或QUIT語句會讓程序塊邏輯更清楚。

使用注釋說明程度代碼段。給程序添加注釋可能會花一些額外的時間,但是很多時候注釋很重要,尤其是當其他人查看或使用代碼時。

語法錯誤。語法錯誤是在SAS語句中犯的錯誤,包括單詞誤拼寫、遺漏或無效的標點符號、無效的語句或數據集選項等。

執行時錯誤。當程序提交執行時,執行時錯誤會讓程序失敗。大多數不嚴重的執行時錯誤會在SAS日志中產生提示消息,但是程序能繼續運行。但如果是更嚴重的錯誤,SAS會打印錯誤消息并停止處理。

數據錯誤。數據錯誤是一種執行時錯誤。當SAS程序正在分析的原始數據包含無效值時就會發生數據錯誤。例如,INPUT語句中指定了數字變量,而原始數據記錄中的數據值是字符。數據錯誤不會引起程序停止,但是會在SAS日志中產生提示信息。

語義錯誤。語義錯誤是另一種執行時錯誤,當SAS語句形式是正確的,但有些選項或語句等的使用方式無效時會發生。例如,函數中指定的參數個數錯誤、在只有字符變量有效的地方使用數字變量名或使用了沒有賦值的邏輯庫引用名等。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢