SAS 程序冷知識——proc import中遇到的那些bug

一、sheet名字過長的問題

當我們用proc import導入一個excel文檔的時候,經(jīng)常會出現(xiàn)這樣的情況:


這是因為excel的sheet名字過長導致的(有時候DM老是把sheet名字弄的老長,還后面綴這日期,搞得每次更新文件都先改程序)。

這種情況下最簡單的處理就是手動修改excel的sheet名字,但是一般作為正式項目,作為外部數(shù)據(jù)的excel是不好隨便改的。

既然不能改文件就只能改程序了,這里提供一個新的方法:

上面是導入失敗的程序,下面是成功的

這兩段程序到底哪里有不同呢?最主要的是dbms=的值不同,前者填寫的是excel,后者填寫的是xlsx。需要注意的是填寫xlsx后,原來的兩個參數(shù)就不能用了需要刪掉。

二、全部導入成字符型

有的時候excel文檔是很討厭的,比如原來數(shù)據(jù)是1.20,當轉成SAS的時候,程序會“貼心”的把變量轉成數(shù)值型,從而丟掉了1.20后面的0。這本來不影響分析,但是ORRES是要收集原始值的,人家填的是1.20,你怎么能寫1.2呢?這個時候就需要我們強制把excel所有變量都變成字符型。

其實這是個偷懶的小技巧。我們只需要修改getnames=這個參數(shù)為no,這樣excel第一行就會被當作變量的值而不是變量名或標題了。而excel的第一行一般來說,都是含有字符的,所以這樣會讓所有變量都被當作字符型處理。

當然,我們還可以直接修改excel,在excel中就直接把所有變量都定義為字符的,但是這樣又犯了改原始數(shù)據(jù)的忌諱總之不推薦。

最后需要注意的是,mixed選項是很重要的,如果是no的話,一列中如果有純數(shù)字的話很容易被判定為數(shù)值型,從而把那些有字符的變量置空。加了mixed=yes以后,一列中如果既有數(shù)字又有字符,就會被判定為字符型。但如果一列真的是純數(shù)字,則會被判定為數(shù)值型。另外,對于日期格式,如果沒有mixed話,會把日期導成date格式的數(shù)值型,但使用mixed之后,日期也會被當作字符處理。

三、導入字符的長度問題

如果dbms=excel的話,導入的字符變量最大長度默認是1024,再長會截斷。但是如果加入語句textsize=32767;可以設定這個長度。但是如果dbms=xlsx的話,就不會出這個問題。

網(wǎng)上說scantext是可以自動掃描變量的最大寬度的,但是實際操作下來似乎并非如此,具體有什么作用還不知道。

四、預讀觀測問題

盡管使用了textsize=32767;,有些變量還是會被截斷。這是因為SAS在讀入的時候,是預先檢查excel前面的若干行來判斷長度和變量類型的,所以如果特別長的值在最后幾行,可能會導致沒有檢查到改行,從而變量長度比值要短,以至于發(fā)生了截斷。這種情況就要用dbms=xlsx了。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容