
SAS程序錯誤及處理
通常我們所開發(fā)的SAS程序,很少在第一次提交時就能夠運(yùn)行完成并產(chǎn)生正確結(jié)果。程序越長越復(fù)雜,就越可能出現(xiàn)語法或邏輯錯誤。本文介紹了一些良好的SAS編程規(guī)范以減少程序錯誤,同時也描述了幾種常見的錯誤及錯誤發(fā)生后對應(yīng)的處理方法。
良好的SAS編程風(fēng)格
在開發(fā)SAS程序的過程中,遵循下面幾條規(guī)則可以使程序出錯的幾率變小,并幫助發(fā)現(xiàn)錯誤。
(1)提高程序的易讀性
一個簡單的方式是在開發(fā)程序時保持代碼的整潔和一致。易讀的程序會更易于調(diào)試,長期來看會節(jié)省時間。在編寫SAS程序時可遵循如下建議以提高程序的易讀性:
每行一條SAS語句。SAS允許在一行寫多個SAS語句,這樣會節(jié)省代碼空間,但是這些空間會以損失程序的易讀性為代價。
(2)測試程序每個部分
在開始寫下一部分的代碼之前,先測試前面已經(jīng)完成的代碼,保證已經(jīng)完成的代碼運(yùn)行正確會極大地提高開發(fā)效率。
如果是從外部數(shù)據(jù)文件讀取數(shù)據(jù)到SAS數(shù)據(jù)集,則使用PROC PRINT打印SAS數(shù)據(jù)集或數(shù)據(jù)集的部分?jǐn)?shù)據(jù),以保證該數(shù)據(jù)集被正確生成。有時,在日志中可能沒有錯誤或可疑的提示,而所生成的數(shù)據(jù)集卻是不正確的。這是因為所開發(fā)的代碼可能并沒有如預(yù)期的讀取數(shù)據(jù),或原始數(shù)據(jù)本身存在某些在開發(fā)代碼時沒有意識到的問題。對此,好的習(xí)慣是,對程序創(chuàng)建的所有SAS數(shù)據(jù)集都至少要打印一次,以進(jìn)行檢查。
(3)正式運(yùn)行程序前使用較小的數(shù)據(jù)集測試程序
有時,使用全部數(shù)據(jù)測試程序是不現(xiàn)實(shí)的。如果數(shù)據(jù)文件特別大,測試所有的數(shù)據(jù)會很費(fèi)時,這時可以使用數(shù)據(jù)的子集來進(jìn)行測試。
如果是從文件中讀取數(shù)據(jù),可以在INFILE語句中使用OBS=告訴SAS讀取文件中的前多少行,例如前50、前100行或更多,只要能代表要讀取的數(shù)據(jù)就行。下面的代碼僅僅讀取文件的前100行:
還可以使用選項FIRSTOBS=指定從文件的中間部分開始讀取數(shù)據(jù)。例如,下面的語句讀取customer.dat文件的第101行到第200行:
同樣選項FIRSTOBS=和OBS=也可以用于在SET語句中讀取該數(shù)據(jù)集中對應(yīng)的觀測。下面的代碼會讀取數(shù)據(jù)集saslib.customer中的第101到第200個觀測。
關(guān)于SET語句及數(shù)據(jù)集選項,下面文章會詳細(xì)介紹。
(4)使用語法敏感的編輯器
在Windows操作系統(tǒng)下,增強(qiáng)型編輯器(Enhanced Editor)是默認(rèn)的編輯器,在其他操作系統(tǒng)下,程序編輯器(Program Editor)是默認(rèn)編輯器。這兩種編輯器都會對代碼的不同部分自動添加顏色,例如SAS關(guān)鍵字是一種顏色,變量是另一種顏色。此外,所有引號中的文本也是同樣的顏色,這樣我們可以很容易區(qū)分是否存在引號不匹配的情況。類似地,遺漏分號也很容易發(fā)現(xiàn),因為分號遺漏可能會導(dǎo)致接下來的代碼顏色不正確。
常見錯誤及處理
SAS程序提交執(zhí)行后會在日志窗口或日志文件中產(chǎn)生代碼運(yùn)行的信息。我們可以根據(jù)日志信息確定什么時候程序發(fā)生錯誤,并獲取信息糾正錯誤。SAS通常會識別四類錯誤:
SAS檢測到錯誤時,通常會將錯誤或檢測到錯誤的位置加下劃線,并顯示一個數(shù)字。每個數(shù)字與一條錯誤消息唯一關(guān)聯(lián)。接著SAS進(jìn)入語法檢查模式,它會讀取剩下的程序語句、檢查語法,并在其他錯誤位置加下劃線。
在批處理或非交互式的程序中,DATA步中的錯誤會導(dǎo)致SAS對剩下的程序一直處于語法檢查模式,其他任何創(chuàng)建外部文件或SAS數(shù)據(jù)集的DATA或PROC步都不會執(zhí)行。然而,讀SAS數(shù)據(jù)集的過程會執(zhí)行,但是讀入的觀測數(shù)會為0,而不讀SAS數(shù)據(jù)集的過程正常執(zhí)行。通常PROC步中的語法錯誤僅僅影響當(dāng)前PROC步。在該P(yáng)ROC步結(jié)束時,SAS會將檢測到的每個錯誤寫入SAS日志。
語法錯誤
有些語法錯誤從日志窗口中很容易理解并改正,有時SAS還會自動糾正并提示警告信息,例如在圖2.50中展示的是關(guān)鍵字拼寫錯誤。關(guān)鍵字INPUT錯誤拼寫為INYUT,SAS給出警告信息并將該拼錯的詞理解為INPUT。這樣,編譯會通過,代碼也會正確執(zhí)行。但SAS并不負(fù)責(zé)將代碼中的錯誤改正,需要開發(fā)人員自己修正。
圖2.50 關(guān)鍵字拼寫錯誤
很多語法錯誤是由于遺漏分號(;)導(dǎo)致的,根據(jù)其在日志窗口的消息,可能沒那么容易找到出錯原因。在下面的代碼中,DATA語句指定了數(shù)據(jù)集名稱之后遺漏分號(;)。
提交代碼執(zhí)行時,因為遺漏分號,SAS認(rèn)為DATA語句中沒有結(jié)束,length和Name都被當(dāng)作數(shù)據(jù)集名。SAS無法解釋接下來出現(xiàn)的$,所以認(rèn)為出錯。SAS在日志中顯示了如圖2.51所示的信息:在$出現(xiàn)的地方加劃線,并給出期待在這個地方出現(xiàn)的名稱或符號,并提示出錯。
圖2.51 遺漏分號
這時需要通過在DATA語句數(shù)據(jù)集名稱之后添加分號(;)來修正該段代碼。
在下面的程序中,INPUT語句使用列表方式讀取數(shù)據(jù)值。要讀取的最后一個變量為數(shù)字型變量,但輸入數(shù)據(jù)中第三行記錄的最后一個字段為字符。
提交執(zhí)行后查看日志窗口信息,如圖2.52所示。SAS提示在第10~13列(因為是列表輸入方式,所以要賦值給Price的是“five”,對應(yīng)于第10~13列)的數(shù)據(jù)對變量Price無效。為了便于分析和修正,SAS還在日志窗口列出了輸入緩沖區(qū)的值、PDV中各變量的值,包括DATA步中定義的變量和自動變量_ERROR_和_N_等。該數(shù)據(jù)錯誤只是會導(dǎo)致所生成的觀測中存在缺失值,DATA步并不會停止執(zhí)行。
圖2.52 數(shù)據(jù)錯誤
對于這樣的問題,有多種處理方式。在本例中可以不作處理,因為它只是會導(dǎo)致觀測中存在缺失值。其他類似的情況,可以通過調(diào)整輸入方式,例如使用格式化輸入等方法來解決。
語義錯誤
在下面的程序中,DATA步讀取外部數(shù)據(jù)文件,并指定文件中字段值之間的分隔符為逗號(,)。注意,其中INFILE語句的選項DLM=誤寫為DLMA=了。
提交程序執(zhí)行后查看日志窗口的信息,如圖2.53所示。SAS提示選項名稱DLMA無效。因為出錯,SAS停止處理并創(chuàng)建沒有觀測值的數(shù)據(jù)集。
圖2.53 語義錯誤
這時需要更正該選項名稱為DLM=,并再次提交執(zhí)行。
引號不配對
在執(zhí)行SAS程序時,有時會出現(xiàn)比較意外的情況。例如提交了代碼后,并不產(chǎn)生任何結(jié)果,日志窗口僅顯示代碼信息,沒有對應(yīng)的SAS語句執(zhí)行提示信息。不知道SAS在干什么,有時編輯器窗口會一直表示PROC步正在運(yùn)行。這時首先需要檢查是不是存在代碼中引號不配對的問題。
在下面的代碼中,F(xiàn)ILNAME語句指定文件引用時,文件名結(jié)束后遺漏了對應(yīng)的單引號(")。
提交代碼執(zhí)行,并查看日志窗口,有原始代碼,但沒有語句執(zhí)行提示信息,如圖2.54所示。
圖2.54 SAS程序運(yùn)行不結(jié)束
遇到的這樣的問題,建議先提交下列代碼將引號配對,從而使程序完成執(zhí)行過程,再來檢查修正程序的錯誤。這三行代碼除了可以解決不匹配的單引號和雙引號外,還可以解決不匹配的注釋標(biāo)記,以及遺漏分號、QUIT或RUN語句的問題:
結(jié)語
“讀取外部數(shù)據(jù)到SAS數(shù)據(jù)集”系列文章首先介紹了SAS編程的基本概念,具體包括SAS邏輯庫、SAS數(shù)據(jù)集、SAS數(shù)據(jù)集管理、系統(tǒng)選項以及SAS程序結(jié)構(gòu)等內(nèi)容;在此基礎(chǔ)上介紹了DATA步處理數(shù)據(jù)的原理,重點(diǎn)講解了如何使用DATA步的各種輸入方式來讀取不同格式的外部文件中的數(shù)據(jù),并創(chuàng)建數(shù)據(jù)集;接下來介紹了如何運(yùn)用IMPORT過程讀取外部的數(shù)據(jù)文件,以及如何通過LIBNAME語句和PROC SQL訪問關(guān)系型數(shù)據(jù)集庫系統(tǒng)中的數(shù)據(jù);最后,還介紹了SAS程序開發(fā)中常見的幾種錯誤現(xiàn)象及其處理方法。
程序的不同部分使用相應(yīng)的縮進(jìn)??s進(jìn)DATA步和PROC步中的所有語句,這種方式會很容易得知程序中有多少個DATA和PROC步,并且知道那些語句屬于哪個過程步。
代碼中引用的所有SAS文件都使用二級名稱,例如work.customer,即使該SAS文件存儲在WORK臨時邏輯庫或USER邏輯庫中。
使用RUN或QUIT語句顯式地表明DATA步或PROC步結(jié)束。雖然SAS會在遇到下一個DATA步或PROC步時自動認(rèn)為當(dāng)前過程步結(jié)束,但是RUN或QUIT語句會讓程序塊邏輯更清楚。
使用注釋說明程度代碼段。給程序添加注釋可能會花一些額外的時間,但是很多時候注釋很重要,尤其是當(dāng)其他人查看或使用代碼時。
語法錯誤。語法錯誤是在SAS語句中犯的錯誤,包括單詞誤拼寫、遺漏或無效的標(biāo)點(diǎn)符號、無效的語句或數(shù)據(jù)集選項等。
執(zhí)行時錯誤。當(dāng)程序提交執(zhí)行時,執(zhí)行時錯誤會讓程序失敗。大多數(shù)不嚴(yán)重的執(zhí)行時錯誤會在SAS日志中產(chǎn)生提示消息,但是程序能繼續(xù)運(yùn)行。但如果是更嚴(yán)重的錯誤,SAS會打印錯誤消息并停止處理。
數(shù)據(jù)錯誤。數(shù)據(jù)錯誤是一種執(zhí)行時錯誤。當(dāng)SAS程序正在分析的原始數(shù)據(jù)包含無效值時就會發(fā)生數(shù)據(jù)錯誤。例如,INPUT語句中指定了數(shù)字變量,而原始數(shù)據(jù)記錄中的數(shù)據(jù)值是字符。數(shù)據(jù)錯誤不會引起程序停止,但是會在SAS日志中產(chǎn)生提示信息。
語義錯誤。語義錯誤是另一種執(zhí)行時錯誤,當(dāng)SAS語句形式是正確的,但有些選項或語句等的使用方式無效時會發(fā)生。例如,函數(shù)中指定的參數(shù)個數(shù)錯誤、在只有字符變量有效的地方使用數(shù)字變量名或使用了沒有賦值的邏輯庫引用名等。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03