Proc Import。从excel文件将字符值导入为“空白”

时间:2013-04-08 20:09:42

标签: import sas

我正在尝试使用以下代码导入多个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

2 个答案:

答案 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)。