如果在工作中疼鸟,需要將保存在EXCEL的數(shù)據(jù)集內(nèi)容導(dǎo)入到SAS后控,并進(jìn)行變量的屬性處理,一般會(huì)涉及Import過(guò)程步空镜。這過(guò)程可能會(huì)遇到一些導(dǎo)入問(wèn)題浩淘,以下是我梳理的相關(guān)內(nèi)容捌朴。
1. EXCEL導(dǎo)入數(shù)據(jù)集
EXCEL內(nèi)容導(dǎo)入SAS數(shù)據(jù)集,常用的方法是Import過(guò)程步张抄,為了文件處理方便砂蔽,我先把EXCEL文件地址設(shè)為工作路徑。
**Set work space;
%sysexec cd "E:\08_SAS\01_import";
EXCEL文件中署惯,頁(yè)面如下察皇,第1行為變量Lable,第2行為變量名稱泽台,之后就是具體的觀測(cè)數(shù)什荣。
使用Import過(guò)程步,進(jìn)行初步導(dǎo)入怀酷。從結(jié)果中可以看出稻爬,所有的數(shù)據(jù)都是從字符讀入,并且日期格式也是讀成了數(shù)字蜕依。關(guān)于日期數(shù)字問(wèn)題桅锄,這里不進(jìn)一步解釋,感興趣的讀者可以參考SAS編程:關(guān)于EXCEL時(shí)間變量導(dǎo)入SAS數(shù)據(jù)集的問(wèn)題样眠。
**Import EXCEL;
proc import datafile="test.xlsx" /*or datafile="E:\08_SAS\01_import\test.xlsx"*/
out=DM1 dbms=xlsx replace;
sheet = "DM";
getnames = no;
run;
2. 特定EXCEL記錄導(dǎo)入數(shù)據(jù)集
2.1 range = 選項(xiàng)
雖然字符格式后續(xù)也方便處理成想要的屬性友瘤,但是SAS導(dǎo)入的時(shí)候也方便自動(dòng)處理。這里我們可以直接將第2行的信息讀取成變量名稱檐束,第3行開(kāi)始讀取成SAS記錄數(shù)辫秧。導(dǎo)入的數(shù)據(jù)集,自動(dòng)將全部為數(shù)字的列轉(zhuǎn)化為數(shù)值變量被丧。(關(guān)于range=
選項(xiàng)盟戏,可以參考SAS官方文檔SAS Help Center: Microsoft Workbook Files)。
**Import EXCEL 2;
proc import datafile="test.xlsx"
out=DM2 dbms=xlsx replace;
range="DM$A2:"n;
getnames = yes;
run;
2.2 sheet = 選項(xiàng)能否實(shí)現(xiàn)甥桂?
處理讀入EXCEL記錄時(shí)柿究,有些讀者可能會(huì)考慮使用sheet = "DM";
、 datarow = 2
以及getnames = yes;
進(jìn)行實(shí)現(xiàn)從第2行讀入并將第2行讀取為變量名稱黄选。事實(shí)上蝇摸,這樣無(wú)法實(shí)現(xiàn)想要的效果。
雖然办陷,語(yǔ)句sheet = "DM";
與range="DM$:"n;
是等價(jià)的貌夕,我們可以正常導(dǎo)入sheet頁(yè)面中所有的信息,但是語(yǔ)句getname =
指定IMPORT過(guò)程懂诗,是否從輸入文件第一行的數(shù)據(jù)值生成SAS變量名蜂嗽。而數(shù)據(jù)集所需要的變量名稱保存在第2行,所以無(wú)法用來(lái)直接命名殃恒。(SAS Help Center: Syntax: PROC IMPORT GETNAMES Statement)
不過(guò)植旧,語(yǔ)句datarow = 3
可以讀取所需要的數(shù)據(jù)記錄辱揭。
**Import EXCEL 3;
proc import datafile="test.xlsx"
out=DM3 dbms=xlsx replace;
sheet = "DM";
datarow = 3;
getnames = yes;
run;
這一點(diǎn)與Data步中,where
與if
語(yǔ)句篩選記錄的對(duì)比關(guān)系類似病附。where
語(yǔ)句篩選進(jìn)入數(shù)據(jù)集處理的觀測(cè)記錄问窃;而if
語(yǔ)句在納入所有觀測(cè)記錄后,再進(jìn)行篩選完沪。
Import過(guò)程步中域庇,語(yǔ)句range="sheet$XX:XX"n
篩選好進(jìn)入SAS數(shù)據(jù)集的EXCEL記錄;而語(yǔ)句datarow = n;
覆积,是在進(jìn)入SAS數(shù)據(jù)集的記錄中听皿,進(jìn)行篩選。
編程中宽档,使用range
語(yǔ)句篩選記錄尉姨,更精準(zhǔn)一些。
3. Libname語(yǔ)句使用注意點(diǎn)
在這篇文章中吗冤,就不介紹批量設(shè)置變量Label的過(guò)程又厉。在設(shè)置單個(gè)數(shù)據(jù)集屬性后,需要批量導(dǎo)入EXCEL Sheet內(nèi)容椎瘟。批量處理的關(guān)鍵是覆致,獲取所有Sheet的名稱。這里可以肺蔚,通過(guò)將EXCEL設(shè)置為SAS邏輯庫(kù)來(lái)實(shí)現(xiàn)煌妈,代碼如下。目前婆排,test.xlsx
文件中有兩個(gè)sheet(DM声旺,VS)。
libname tmp excel "test.xlsx";
導(dǎo)入的數(shù)據(jù)集內(nèi)容段只,是sheet中的所有信息。信息保存到邏輯庫(kù)中鉴扫,我們就可以通過(guò)SAS字典赞枕,來(lái)獲取EXCEL中sheet名稱和數(shù)目信息,并把這兩個(gè)信息保存到宏變量&sheetnam
坪创、&sheetnum
中炕婶。
關(guān)于Proc SQL如何將一整列變量值或一行記錄值保存到宏變量,可以參考SAS編程:Proc SQL生成宏變量時(shí)INTO子句的使用莱预。
*Get sheet names and sheet num and save them into macro vars;
proc sql noprint;
create table tmp1 as
select distinct scan(memname, 1, "$") as name, count(distinct scan(memname, 1, "$") ) as num
from dictionary.tables
where libname = "TMP";
select distinct scan(memname, 1, "$"), count(distinct scan(memname, 1, "$") ) into: sheetnam separated by "!" , :sheetnum
from dictionary.tables
where libname = "TMP";
quit;
經(jīng)過(guò)一番整理后柠掂,批量處理Sheet的程序基本完善,但是批量使用Import過(guò)程步時(shí)依沮,會(huì)出Error涯贞。
proc import datafile="test.xlsx"
out=DM dbms=xlsx replace;
sheet = "DM";
getnames = no;
run;
檢查后發(fā)現(xiàn)原因:邏輯庫(kù)在調(diào)用EXCEL時(shí)枪狂,Import過(guò)程步無(wú)法讀取EXCEL信息。這個(gè)問(wèn)題取消邏輯庫(kù)的分配可以解決宋渔。
在日常編程中州疾,如果需要臨時(shí)使用邏輯庫(kù),使用完畢后可以立即釋放皇拣,避免后續(xù)調(diào)用出現(xiàn)問(wèn)題严蓖。
libname tmp excel "test.xlsx";
結(jié)語(yǔ)
本文介紹了使用Proct Import將EXCEL文件導(dǎo)入SAS數(shù)據(jù)集時(shí),記錄篩選氧急、命名的問(wèn)題颗胡,建議使用range
語(yǔ)句篩選記錄,避免偏誤吩坝。對(duì)于臨時(shí)邏輯庫(kù)毒姨,建議使用完畢后立即釋放,避免后續(xù)調(diào)用文本出現(xiàn)問(wèn)題钾恢。
感謝閱讀手素!若有疑問(wèn),歡迎評(píng)論區(qū)交流瘩蚪!