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