在SAS中导入Excel文件,标题为数据集,第二个标题为列名

时间:2019-04-18 06:15:22

标签: sas

如何在SAS Progrmming中使用以下条件将数据从单个Excel文件导入到多个数据集。

  1. 第一行是数据集名称,用于分类不同DS中的所有数据集(DS)。
  2. 第二行是单独数据集的列名。
  3. 第三行是插入到相应数据集和列中的原始数据。

使用proc导入 enter image description here

3 个答案:

答案 0 :(得分:0)

这不是一个好问题。一个好问题应该显示您的源数据,到目前为止已经尝试过的代码,并描述一个或两个问题,这些问题需要您的帮助。

但是,基于可用的有限信息,我会这样说:您无法在PROC IMPORT中一步完成所有操作。您将需要分阶段执行此操作;首先,像往常一样使用PROC IMPORT将整个工作表导入到一个数据集中,然后分析该数据集以从第一列中导出不同的数据集名称,并从第二列中导出变量名称(您需要验证它们以确保它们是有效的数据集/变量名),然后编写其他宏代码以生成每个数据集。

您也许可以使用PROC TRANSPOSE将每一行的数据从“高”格式转换为“宽”格式。您的源数据如何表示每个数据集中新记录的开始?您如何知道每一列应该是字符还是数字?您怎么知道每个变量应该多长时间?

所描述的源数据格式听起来很糟糕-假设这不是一个家庭作业问题,那么最好返回数据源并请求更好的传输。

答案 1 :(得分:0)

@ Chris-Long指出,您一口气也做不了想要的事。

SAS /访问PCFILE中的XLSX引擎支持从命名范围或绝对范围导入。这是处理包含Sheet1

的Excel文件的第一张纸的示例
filename myexcel 'c:\temp\sandbox.xlsx';

proc import 
  file=myexcel 
  dbms=XLSX
  replace
  out=Sheet1_DSName
;
  range="'Sheet1'$A1:A1";  /* Upper left cell contains eventual SAS data set name */
  getnames=no;
run;

proc import 
  file=myexcel 
  dbms=XLSX
  replace
  out=Sheet1_Data
;
  range="'Sheet1'$A2:Z100";  /* read second row to hundredth row as headered data */
                             /* getnames=yes is default */
run;

proc sql noprint;
  select A into :name from Sheet1_DSName;

proc datasets nolist lib=work;
  age Sheet1_Data &name;  /* rename the data data set to name as found in A1 */
run;

答案 2 :(得分:0)

基本上,您需要读取XLSX文件两次。第一次读取将获取前两行中的数据,然后第二次读取可跳过这些行。然后,您可以使用前两行中的数据来了解如何将数据拆分为单独的数据集。

首先让我们制作一个测试XLSX文件。

data sample;
 input (x1-x9) (:$32.);
cards;
ds1 ds1 ds1 ds2 ds2 ds2 ds3 ds3 ds3
id gender name department department_name employees name category division
1 e q a w 23 q t oi
2 e q a x 24 q y uy
;

proc export data=sample dbms=xlsx file="&path\sample.xlsx" replace ;
  putnames=no;
run;

现在让我们以不带名称的方式阅读整个内容,并仅转换前两行,以便我们可以看到有多少列。

proc import datafile="&path\sample.xlsx" dbms=xlsx 
  out=raw replace ;
  getnames=no;
run;

proc transpose data=raw(obs=2) out=names ;
  var _all_;
run;

然后,我们可以使用行数和列数来生成RANGE,以用于读取实际数据。这很重要,因为它应该允许数字列作为数字变量出现,因为IMPORT不会尝试在数据中包括列名。

data _null_;
   set names (keep=_name_) point=ncols nobs=ncols;
   set raw (drop=_all_) nobs=nrows;
   call symputx('range',cats('$A3:',_name_,nrows));
   stop;
run;
%put &=range;

proc import datafile="&path\sample.xlsx" dbms=xlsx 
  out=values replace ;
  range="&range";
  getnames=no;
run;

现在,我们可以使用名称上的信息来生成代码,以将大数据集拆分为小数据集。看来您想将第一列保留在所有数据集上,所以我们也将其包括在内。

filename code temp;
data _null_;
  file code;
  if _n_=1 then set names(keep=_name_ col2 rename=(_name_=idcol col2=idvar));
  do until (last.col1);
    set names ;
    by col1 notsorted ;
    if first.col1 then put 'data ' col1 ';' / '  set values(keep=' idcol _name_ '--' @;
    if last.col1 then put _name_ ');' / '  rename ' idcol '=' idvar ';' ;
  end;
  put '  rename';
  do until (last.col1);
    set names ;
    by col1 notsorted ;
    put '    ' _name_ '=' col2  ;
  end;
  put '  ;' / 'run;' ;
run;
%include code / source2;