在sas中导入excel文件,标题为dataset,第二个标题为列名

在sas中导入excel文件,标题为dataset,第二个标题为列名,sas,Sas,在SAS编程中,如何将数据从单个excel文件导入到具有以下条件的多个数据集 第一行是数据集名称,分类不同DS中的所有数据集(DS) 第二行是单独数据集的列名 第三行是插入到相应数据集和列中的原始数据 使用proc导入 目前来看,这不是一个好问题。一个好的问题应该显示您的源数据、您迄今为止尝试过的代码,并描述您在使其工作时遇到的问题,以及您需要帮助的一两个具体问题 然而,基于可用的有限信息,我要说:您不能在PROC IMPORT中的一个步骤中完成所有这些。你需要分阶段完成这项工作;首先,正常使用

在SAS编程中,如何将数据从单个excel文件导入到具有以下条件的多个数据集

  • 第一行是数据集名称,分类不同DS中的所有数据集(DS)
  • 第二行是单独数据集的列名
  • 第三行是插入到相应数据集和列中的原始数据
  • 使用proc导入

    目前来看,这不是一个好问题。一个好的问题应该显示您的源数据、您迄今为止尝试过的代码,并描述您在使其工作时遇到的问题,以及您需要帮助的一两个具体问题

    然而,基于可用的有限信息,我要说:您不能在
    PROC IMPORT
    中的一个步骤中完成所有这些。你需要分阶段完成这项工作;首先,正常使用
    PROC import
    将整个工作表导入单个数据集,然后分析数据集,从第一列导出不同的数据集名称,从第二列导出变量名称(您需要验证这些名称,以确保它们是有效的数据集/变量名称),然后编写额外的宏代码来生成每个数据集

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


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

    目前这不是一个好问题。一个好的问题应该显示您的源数据、您迄今为止尝试过的代码,并描述您在使其工作时遇到的问题,以及您需要帮助的一两个具体问题

    然而,基于可用的有限信息,我要说:您不能在
    PROC IMPORT
    中的一个步骤中完成所有这些。你需要分阶段完成这项工作;首先,正常使用
    PROC import
    将整个工作表导入单个数据集,然后分析数据集,从第一列导出不同的数据集名称,从第二列导出变量名称(您需要验证这些名称,以确保它们是有效的数据集/变量名称),然后编写额外的宏代码来生成每个数据集

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


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

    正如@Chris Long所说,你不能一次性完成你想要的任务

    SAS/Access to PCFILE中的XLSX引擎支持从命名范围或绝对范围导入。下面是一个处理包含
    Sheet1

    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;
    

    正如@Chris Long所说,你不能一次完成你想要的

    SAS/Access to PCFILE中的XLSX引擎支持从命名范围或绝对范围导入。下面是一个处理包含
    Sheet1

    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;
    

    您基本上需要读取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;
    
    然后,我们可以使用行数和列数来生成用于读取实际数据的范围。这一点很重要,因为它应该允许数值列作为数值变量出现,因为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;
    

    您基本上需要读取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;
    
    然后,我们可以使用行数和列数来生成用于读取实际数据的范围。这一点很重要,因为它应该允许数值列作为数值变量出现,因为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;
    

    所有列块的行数是否相同?所有列块的行数是否相同?