如何在SAS Progrmming中使用以下条件将数据从单个Excel文件导入到多个数据集。
答案 0 :(得分:0)
这不是一个好问题。一个好问题应该显示您的源数据,到目前为止已经尝试过的代码,并描述一个或两个问题,这些问题需要您的帮助。
但是,基于可用的有限信息,我会这样说:您无法在PROC IMPORT
中一步完成所有操作。您将需要分阶段执行此操作;首先,像往常一样使用PROC IMPORT
将整个工作表导入到一个数据集中,然后分析该数据集以从第一列中导出不同的数据集名称,并从第二列中导出变量名称(您需要验证它们以确保它们是有效的数据集/变量名),然后编写其他宏代码以生成每个数据集。
您也许可以使用PROC TRANSPOSE
将每一行的数据从“高”格式转换为“宽”格式。您的源数据如何表示每个数据集中新记录的开始?您如何知道每一列应该是字符还是数字?您怎么知道每个变量应该多长时间?
所描述的源数据格式听起来很糟糕-假设这不是一个家庭作业问题,那么最好返回数据源并请求更好的传输。
答案 1 :(得分:0)
@ Chris-Long指出,您一口气也做不了想要的事。
SAS /访问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;
答案 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;