импортировать файл Excel в sas с заголовком набора данных и вторым заголовком с именем столбца - PullRequest
1 голос
/ 18 апреля 2019

как импортировать данные из одного файла Excel в несколько наборов данных при следующих условиях в программе SAS Progrmming.

  1. первая строка - это имя набора данных, которое классифицирует все наборы данных (DS) в разных разных DS.
  2. вторая строка - это имя столбца для отдельного набора данных.
  3. , а третья строка - необработанные данные, вставленные в соответствующий набор данных и столбец.

с использованием процедуры импорта enter image description here

Ответы [ 3 ]

0 голосов
/ 18 апреля 2019

Как @ Крис-Лонг заявляет, что вы не можете делать то, что хотите, за один раз.

Механизм XLSX в SAS / Access to PCFILE поддерживает импорт из именованного диапазона или абсолютного диапазона. Вот пример для обработки первого листа файла Excel, содержащего 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;
0 голосов
/ 18 апреля 2019

Вам нужно прочитать файл 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;
0 голосов
/ 18 апреля 2019

Это не очень хороший вопрос в его нынешнем виде. Хороший вопрос должен показать ваши исходные данные, код, который вы пробовали до сих пор, и описать проблемы, с которыми вы сталкиваетесь, чтобы заставить его работать, с одним или двумя конкретными вопросами, с которыми вам нужна помощь.

Однако, исходя из доступной ограниченной информации, я скажу следующее: вы не можете сделать все это за один шаг в PROC IMPORT. Вам нужно будет сделать это поэтапно; сначала импортируйте весь лист в один набор данных, используя PROC IMPORT как обычно, затем проанализируйте набор данных, чтобы получить отдельный набор имен наборов данных из первого столбца и имена переменных из второго столбца (вам потребуется проверить эти чтобы убедиться, что они являются действительными наборами данных / именами переменных), затем напишите дополнительный макрос-код для генерации каждого из наборов данных.

Возможно, вы сможете использовать PROC TRANSPOSE для переноса данных из каждой строки из «высокого» в «широкий» формат. Как ваши исходные данные представляют начало новой записи в каждом наборе данных? Как узнать, должен ли каждый столбец быть символьным или числовым? Как узнать, какой длины должна быть каждая переменная?

Исходный формат данных, как описано, звучит довольно ужасно - предполагая, что это не домашний вопрос, может быть лучше вернуться к источнику данных и попросить о лучшей передаче.

...