【问题标题】:Loop over all Excel files within a folder and extract a certain cell of each with SAS循环遍历文件夹中的所有 Excel 文件,并使用 SAS 提取每个文件的某个单元格
【发布时间】:2021-03-09 07:06:18
【问题描述】:

假设我们有一个数据目录C:\temp\,其中包含数百个 Excel 文件,例如isin47.xlsisin11.xls。在每个 Excel 文件中,我想提取单元格 $E$16 的值并创建一个长表 result,如下所示,假设文件在该单元格中分别具有 299792458662607004 作为值。

isin   value_euro
47     299792458
11     662607004      

如何在 SAS 中最有效地做到这一点?

到目前为止,我的想法是以下算法:

  1. 循环遍历目录中的所有文件并创建一个包含所有名称的表myExcels,请参阅How to iterate through files in SAS?
  2. 循环 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;
  1. 收集表results中的所有&value.

这种方法存在问题,它依赖于 Excel 单元格 $D$1$E$1$D$13 中的值,通常情况并非如此,除非我编写 VBA 宏来填充单元格(我想要避免支持纯 SAS 解决方案)。

期待任何cmets或建议。

PS @allOutsideFinance:ISIN 唯一地定义了金融资产。

【问题讨论】:

标签: excel import sas


【解决方案1】:

要从 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;

【讨论】:

  • 这就是我在此期间发现的。不过,我仍在为聚合而苦苦挣扎。我不确定如何进行聚合步骤。我想可以避免全局变量...
  • 它确实是一个累积(或增值)数据集。 @Tom 有一个数据集 want 通过 insert into SQL 语句收集每个值。
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2022-11-26
  • 2016-10-07
相关资源
最近更新 更多