0

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

2 回答 2

1

在导入的 Excel 工作簿中控制数据类型的最佳方法是使用DBSASTYPE带有 libname 的数据集选项。这在处理其他数据类型(如日期时间和时间值)时特别有用。

例如,假设受影响的列名为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 列的名称,这应该可以正常工作。

于 2013-04-08T23:23:08.613 回答
0

Mixed=Yes 应该为您解决问题,但如果不是,那么有一些解决方案。

首先,您可能需要检查您的扫描值。您可以在这里看到一个可能的位置:http: //support.sas.com/kb/35/563.html

HKEY_LOCAL_MACHINE ► 软件 ► Microsoft ► Office ► 12.0 ► 访问连接引擎 ► 引擎

如果您有旧版本的 Office(2007 年之前),它被称为“JET 引擎”,并且位于稍微不同的地方(您可以谷歌搜索)。您的“12.0”可能会有所不同,具体取决于您安装的内容(12.0 是 Office 2007)。

其次,您可以强制列为特定类型。DBSASTYPE 选项是你需要去的地方;参见http://www2.sas.com/proceedings/sugi31/020-31.pdf例如(大约在文档中间,搜索 DBSASTYPE)。

于 2013-04-08T21:27:33.470 回答