Вам нужно прочитать файл 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;