您好,登錄后才能下訂單哦!
1.設在路徑:c:"books"learning下有文本文件mydata.txt,其數據以空格格開,形式如下:
M 50 68 155
F 23 60 101
M 65 72 220
F 35 65 133
M 15 71 166
讀入SAS的代碼如下:
data demographics;
infile 'c:"books"learning"mydata.txt';
input Gender $ Age Height Weight;
run;
符號$ 表示變量Gender為一字符型變量。為了檢查讀入文件是否正確,可以通過Print過程察看其觀測值。
title "Listing of data set DEMOGRAPHICS";
proc print data=demographics;
run;
若源文件中的數據有缺失值怎么辦?比如說mydata.txt的數據內容如下
M 50 68 155
F 60 101
M 65 72 220
F 35 65 133
M 15 71 166
當SAS讀到第二行時,會以60代表年齡,101代表身高。接下來會以下一行M代表體重,而M是一字符型變量。叮當,SAS在Log中報錯了。正確的方式為,以 . 代表缺失值。如下圖
M 50 68 155
F . 60 101
M 65 72 220
F 35 65 133
M 15 71 166
2.讀入CSV格式文件。
無需廢話,看代碼
data demographics;
infile 'c:"books"learning"mydata.csv' dsd;
input Gender $ Age Height Weight;
run;
DSD(delimiter-sensitive data)有幾個作用。其一,表明以逗號分隔數據;其二,在一行中若有兩個逗號,表明在中間有一個缺失值;其三,若字符型變量置有引號,則可以去掉其引號。上述代碼的另一種形式為
filename preston 'c:"books"learning"mydata.csv';
data demographics;
infile preston dsd;
input Gender $ Age Height Weight;
run;
變量demographics是實際文件名字的別名。
如果csv格式文件不是以逗號分隔開,怎么辦?例如下述文件以冒號分隔數據
M:50:68:155
F:23:60:101
M:65:72:220
F:35:65:133
M:15:71:166
讀入此文件時,使用下述形式
infile 'file-description' dlm=':' ;或者infile 'file-description' delimiter=':';
如果數據是以TAB隔開呢?事情有點麻煩,但還在控制中。此時以十六進制字符代表TAB,例如
對于ASCII文件,infile 'file-description' dlm='09'x;
對于EBCDIC文件,infile 'file-description' dlm='05'x;
3.讀入固定列--方式1:列輸入
許多數據是以固定列(fixed columns)的形式保存在文件中。讀入此種文件可以列輸入(column input)的方式讀入。這種方法可以讀入字符型變量,格式化數字。格式化數字,不僅是正負形式的數據,還有指數形式的數值。比方說3.4E3表示3.4*10^3.
假設有如下形式的數據,保存在bank.txt中。
00110/21/1955M 1145
00211/18/2001F 18722
00305/07/1944M 123.45
00407/25/1945F -12345
沒有任何分隔符。怎么辦,看代碼
data financial;
infile 'c:"books"learning"bank.txt';
input Subj $ 1-3
DOB $ 4-13
Gender $ 14
Balance 15-21;
run;
方式2.格式化輸入(Formatted input)
當數據是非標準化形式存放時,就應當考慮格式化輸入方法了。還是以上面的例子為例,格式化輸入的代碼為
data financial;
infile 'c:"books"learning"bank.txt';
input @1 Subj $3.
@4 DOB mmddyy10.
@14 Gender $1.
@15 Balance 7.;
run;
符號@稱為列指針(Column Pointer),@4就是告訴SAS,指到第4列。有兩種格式化形式,w.d和$w。w告訴SAS有幾列數據需要讀取,d表示小數點在其值的位置。例如,以3.0形式讀入123,SAS會保存為123.0,對同一數字以3.1讀入,SAS會保存為12.3.如果需讀入的數字本身有小數點,則d將會被忽略。如以4.1的形式讀入1.23,SAS仍會保存為1.23.而$w表示將讀入w列數據。
需要讀入日期數據時,MMDDYY10.告訴SAS以mm/dd//yyyy的形式讀入日期,SAS會以1960年1月1日為起始日到此日期的天數保存。所以,如果讀入01/01/1960,SAS會保存為0.
執行上述代碼后,顯示的數據為
Obs Subj DOB Gender Balance
1 001 -1533 M 1145.00
2 002 15297 F 18722.00
3 003 -5717 M 123.45
4 004 -5273 F -12345.00
此時生日均被顯示為離1960年1月1日的天數。如果想以常規形式顯示,將日期重新進行格式化輸出
title "Listing of FINANCIAL";
proc print data=financial;
format DOB mmddyy10.
Balance dollar11.2;
run;
結果顯示為
Listing of FINANCIAL
Obs Subj DOB Gender Balance
1 001 10/21/1955 M $1,145.00
2 002 11/18/2001 F $18,722.00
3 003 05/07/1944 M $123.45
4 004 07/25/1945 F $-12,345.00
4.使用Format表達式
假設有一份文件,其數據被空格或逗號隔開,字符長大于8字節。讀入時,在Input表達式中緊隨變量名后,附上格式形式。中間以冒號隔開。
例如,設有一份CSV文檔,其內容如下
"001","Christopher Mullens",11/12/1955,"$45,200"
"002","Michelle Kwo",9/12/1955,"$78,123"
"003","Roger W. McDonald",1/1/1960,"$107,200"
看代碼:
data list_example;
infile 'c:"books"learning"list.csv' dsd;
input Subj : $3.
Name : $20.
DOB : mmddyy10.
Salary : dollar8.;
format DOB date9. Salary dollar8.;
run;
另外一種使用Informat表達式的讀入數據形式,是顯式地使用Informat.上述讀入代碼可以為
data list_example;
informat Subj $3.
Name $20.
DOB mmddyy10.
Salary dollar8.;
infile 'c:"books"learning"list.csv' dsd;
input Subj
Name
DOB
Salary;
format DOB date9. Salary dollar8.;
run;
如果前述CSV文件中的數據是以空格隔開,且字符沒有引號。例如
001 Christopher Mullens 11/12/1955 $45,200
002 Michelle Kwo 9/12/1955 $78,123
003 Roger W. McDonald 1/1/1960 $107,200
問題就來了。名字中的空格會使用SAS以為變量已結束,導致讀入不正確。
問題的解決之道在于以&代替冒號:,讀入的代碼為
data list_example;
infile 'c:"books"learning"list.txt';
input Subj : $3.
Name & $20.
DOB : mmddyy10.
Salary : dollar8.;
format DOB date9. Salary dollar8.;
run;
頂
0
踩
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。