假设我们有一个数据目录C:\temp\
,其中包含数百个Excel文件,例如isin47.xls
和isin11.xls
。在每个Excel文件中,我要提取单元格的值$E$16
并创建一个长表result
,该表如下所示,假定文件分别在该单元格中具有299792458
和662607004
作为值。
isin value_euro
47 299792458
11 662607004
如何在SAS中最有效地做到这一点?
到目前为止,我的想法是使用以下算法:
myExcels
具有所有名称的表,请参阅如何遍历SAS中的文件?myExcels
并使用类似的代码导入每个proc import
datafile="C:\temp\isin47.xls"
dbms=excelcs
out=data_current_isin
replace;
run;
proc sql;
select Value_found_in_E_1 into: value trimmed
from data_current_isin
where Value_found_in_D_1 = "Value_found_in_D_13";
quit;
%put ISIN 47 has value of &value. Euro;
&value.
表中的所有内容results
。这种方法的问题,它依赖于在Excel的单元格的值$D$1
,$E$1
而$D$13
这是在一般的情况并非如此,除非我写VBA宏以填充细胞(我想避免赞成纯SAS解决方案)。
期待任何意见或建议。
PS @allOutsideFinance:该ISIN唯一定义的金融资产。
要从XLS文件读取单个单元格,请仅使用单个单元格的RANGE。确保还告诉IMPORT不要查找变量名。
proc import datafile='c:\downloads\test_import.xls' dbms=xls
out=cell replace
;
getnames=NO;
range='$B2:B2';
run;
然后,只需将其添加到您的汇总数据集即可。
创建一个以读取文件名作为输入的宏可能是最容易的。
%macro read_one(filename);
proc import datafile="&filename" dbms=xls
out=cell replace
;
getnames=NO;
range='$B2:B2';
run;
proc sql;
insert into want(filename,value_euro)
select "&filename",B from cell
;
quit;
%mend;
然后,您可以使用文件列表来生成对宏的调用。首先设置一个空文件以接收记录。
data want;
length filename $256 value_euro 8 ;
stop;
run;
然后使用一个数据步骤并为每个文件生成对宏的一次调用。例如,您可以使用CALL EXECUTE。
data _null_;
set filelist ;
call execute(cats('%nrstr(%read_one)(',filename,')'));
run;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句