我的同事和我有三个zip文件,代表从NPPES数据传播的CMS每月下载的三次迭代(3月,4月和5月)。我们使用以下代码从最新的zip文件中提取我们需要的内容,并创建一个相当紧凑的数据集。
PROC IMPORT OUT=NPI_Layout
DATAFILE= "&dir./NPI File Layout.xlsx"
DBMS=XLSX REPLACE;
SHEET="Sheet1";
RUN;
options compress = yes;
data npi_layout;
set npi_layout;
length infmt fmt inpt $60. lbl $200.;
if type = 'NUMBER' then do;
infmt = 'informat '||compress(field)||' '||compress(length)||'.;';
fmt = 'format '||compress(field)||' '||compress(length)||'.;';
inpt = compress(field);
end;
else if type = 'VARCHAR' then do;
infmt = 'informat '||compress(field)||' $'||compress(length)||'.;';
fmt = 'format '||compress(field)||' $'||compress(length)||'.;';;
inpt = compress(field)||' $';
end;
else if type = 'DATE' then do;
infmt = 'informat '||compress(field)||' mmddyy10.;';
fmt = 'format '||compress(field)||' date9.;';
inpt = compress(field);
end;
lbl = 'label '||compress(field)||" = '"||trim(label)||"';";
run;
proc sql noprint;
select infmt
,fmt
,inpt
,lbl
into :infmt1 -
,:fmt1 -
,:inpt1 -
,:lbl1 -
from npi_layout;
quit;
%macro loop;
%let infmt_stmnt = ;
%let fmt_stmnt = ;
%let inpt_stmnt = input;
%let lbl_stmnt = ;
%do i = 1 %to &sqlobs;
%let infmt_stmnt = &infmt_stmnt &&infmt&i;
%let fmt_stmnt = &fmt_stmnt &&fmt&i;
%let inpt_stmnt = &inpt_stmnt &&inpt&i;
%let lbl_stmnt = &lbl_stmnt &&lbl&i;
%end;
data npi.npi;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile inzip(npidata_pfile_20050523-20180513.csv)
delimiter = ',' MISSOVER DSD lrecl = 32767 firstobs = 2;* obs = 10000;
&infmt_stmnt;
&fmt_stmnt;
&inpt_stmnt;
&lbl_stmnt;
run;
%mend loop;
%loop;
当我们从3月开始在文件上运行上面的代码时,我们得到了一个成功的输出。但是,当我们尝试在4月和5月下载时运行它时,我们会收到以下错误:
日志错误
ERROR: Open failure for
*dir*/NPI/Downloads/NPPES_Data_Dissemination_May_2018.zip
during attempt to create a local file handle.
Google只返回一个结果,这表示当文件名(或路径可能)错误时弹出错误。我们多次仔细检查了路径和文件名,这一切都是正确的(显然,代码适用于March文件)。另外,如果我更改代码,所以它试图从zip文件中提取不存在的.csv,它会给我一个关于zip文件中不存在的文件的不同错误,所以它首先清楚地看到了zip文件。我们不确定发生了什么事;有什么建议吗?
(如果您想亲自检查文件,数据来自http://download.cms.gov/nppes/NPI_Files.html。)
答案 0 :(得分:0)
您是否尝试在会员名称周围添加引号?
infile inzip("npidata_pfile_20050523-20180513.csv") ...
答案 1 :(得分:0)
在Windows 10 64位上看到相同的ERROR消息,有足够的RAM和磁盘空间。
ZIP引擎使用的Windows内部可能正在处理涉及文件句柄的流。所以我怀疑ZIP引擎试图分配太多RAM或太大的中间文件来处理提取6GB" npidata_pfile_20050523-20180513.csv"。
将问题提交给SAS支持 - 可能有一些会话设置会让引擎对该文件起作用。如果没有,您必须在SAS之外提取文件。
四月和五月的pfile大小有多大?