我正在尝试使用以下代码导入多个Excel文件。每个excel文件中都有一列具有数值和文本值,但proc import仅导入数值,并将文本值设为空('。')。
任何人都可以帮我解决这个问题吗?非常感谢。
%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 :(得分:1)
在导入的Excel工作簿中控制数据类型的最佳方法是使用带有libname的DBSASTYPE
数据集选项。这在处理其他数据类型(如日期时间和时间值)时特别有用。
例如,假设受影响的列名为 MY_VAR ,并且应始终将其读取为最大长度为30的字符。我们还假设您有一个名为 START_TIME的电子表格列,其中包含Excel编码的日期和时间戳。您的宏可能会像这样修改:
libname x "&&filename&i";
data &&dsn&i;
set x.'Sheet1$'n(dbsastype=(MY_VAR=char30 START_TIME=datetime));
run;
libname x clear;
只要您知道导致问题的Excel列的名称,这应该可以正常工作。
答案 1 :(得分:0)
混合=是应该为你解决问题,但如果不是,那么有一些解决方案。
首先,您可能需要检查扫描值。你可以在这里看到一个可能的位置: http://support.sas.com/kb/35/563.html
HKEY_LOCAL_MACHINE►软件►微软►办公室►12.0►访问连接引擎►引擎
如果你有一个较旧版本的办公室(2007年之前),它被称为“JET引擎”,并且位于一个稍微不同的地方(你可以google它)。您的“12.0”可能会有所不同,具体取决于您安装的内容(12.0是Office 2007)。
其次,您可以强制列为特定类型。 DBSASTYPE选项是你需要的地方;例如,请参阅http://www2.sas.com/proceedings/sugi31/020-31.pdf(在文档中间,搜索DBSASTYPE)。