2013-04-08 75 views
0

我想用下面的代碼導入多個excel文件。每個excel文件中都有一個列有數值和文本值,但proc import只導入數值,並將文本值設爲空白('。')。Proc導入。從Excel文件導入字符值爲「空白」

任何人都可以幫我解決這個問題嗎?非常感謝。

%let subdir=S:\Temp\; 

filename dir "&subdir.*.xls"; 

data new; 

length filename fname $ 32767; 

infile dir eof=last filename=fname; 

input ; 

last: filename=fname; 

run; 

proc sort data=new nodupkey; 

by filename; 

run; 

data null; 

set new end=last; 

call symputx(cats('filename',_n_),filename); 

call symputx(cats('dsn',_n_),scan(scan(filename,7,'\'),1,'.')); 

if last then call symputx('nobs',_n_); 

run; 

%put &nobs; 

%macro import; 

%do i=1 %to &nobs; 


proc import datafile="&&filename&i" out=&&dsn&i 

dbms=excel replace; 

sheet = "Sheet1"; 

getnames=yes; 

mixed=yes; 

run; 


%end; 

%mend import; 

%import 

回答

0

混合=是應該爲您解決問題,但如果不是,那麼有幾個解決方案。

首先,您可能需要檢查掃描值。你可以看到一個可能的位置在這裏: http://support.sas.com/kb/35/563.html

HKEY_LOCAL_MACHINE►軟件►微軟►辦公室►12.0►訪問連接引擎►發動機

如果你的辦公室(前2007年)的舊版本,它被稱爲「JET引擎」,位於一個稍微不同的地方(你可以谷歌它)。根據您安裝的內容(12.0是Office 2007),您的「12.0」可能會有所不同。

其次,你可以強制列爲特定類型。 DBSASTYPE選項是你需要去這個的地方;例如見http://www2.sas.com/proceedings/sugi31/020-31.pdf(大約在文檔的中間,搜索DBSASTYPE)。

1

在導入的Excel工作簿中控制數據類型的最佳方法是使用帶有libname的DBSASTYPE數據集選項。在處理其他數據類型時(例如日期時間和時間值),這是特別有用的。

例如,讓我們假設受影響的列被命名爲MY_VAR,應始終被理解爲具有30一個最大長度的字符而且我們還假設你有一個名爲START_TIME電子表格列中包含編碼的Excel日期和時間戳。您的宏可能會修改這樣的:只要你知道Excel列導致該問題的名稱

libname x "&&filename&i"; 
data &&dsn&i; 
    set x.'Sheet1$'n(dbsastype=(MY_VAR=char30 START_TIME=datetime)); 
run; 
libname x clear; 

,這應該很好地工作。

+0

感謝您的回覆。我仍然將SAS中的字符值視爲空白。 – datacentric 2013-04-09 21:44:31