Как получить заголовки набора данных Sas для экспорта в таблицу Excel через DDE - PullRequest
0 голосов
/ 06 мая 2018

Итак, я пытаюсь написать макрос, который экспортирует мой набор данных sas в существующую таблицу Excel. Я использую следующий код, который я нашел из одной из статей SUGI. Проблема состоит в том, что следующий код выполняет работу успешно, но он просто не может скопировать, вставить заголовки (имена переменных) в Excel и просто вставляет все наблюдения. Как мне заставить мой код также вставить заголовки (имена переменных) в excel

%MACRO EXCELOUT(SDS=,XLSSHT=,XLSF=, ROW=,COL= ) ;

PROC CONTENTS DATA=&SDS NOPRINT OUT=CNT ;
RUN;
PROC SORT DATA=CNT ;
BY VARNUM ;
RUN;

PROC SQL NOPRINT;
SELECT NAME
INTO: VARS SEPARATED BY ' '
FROM CNT ;
SELECT COUNT(DISTINCT NAME)
INTO: COLS SEPARATED BY ' '
FROM CNT ;
SELECT NOBS
INTO: ROWS
FROM CNT
WHERE VARNUM = 1;
QUIT;

OPTIONS NOXWAIT NOXSYNC ;
X "&XLSF" ;

DATA _NULL_ ;
X=SLEEP(5);
RUN ;

FILENAME TEMP DDE "EXCEL|&XLSSHT.!R&ROW.C&COL.:R%TRIM(%EVAL(&ROWS+&ROW1))C%TRIM(%EVAL(&COLS+&COL)" ;

DATA _NULL_ ;
SET &SDS ;
FILE TEMP ;
PUT &VARS ;
RUN ;

FILENAME CMDS DDE 'EXCEL|SYSTEM' ;
DATA _NULL_ ;
FILE CMDS ;
PUT '[SAVE()]' ;
PUT '[QUIT()]' ;
RUN ;

%MEND EXCELOUT ;

1 Ответ

0 голосов
/ 06 мая 2018

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

data _null_ ;
  file temp ;
  if _n_=1 then do;
    do _n_=1 to &cols ;
      set cnt(keep=name rename=(name=__name__)) ;
      put __name__ @;
    end;
    put;
  end;
  set &sds ;
  put &vars ;
run ;

Ваш код для получения имен переменных и подсчета строк и столбцов также может быть проще.

proc sql noprint;
 select nobs
      , name
   into :rows trimmed
      , :vars separated by ' '
   from cnt
 ;
 %let cols = &sqlobs ;
quit;

Вашему оператору FILENAME не требуется% TRIM (), и в нем отсутствовало +, необходимое для добавления одной строки для заголовка. Сделано так, будто оно ссылается на &row1 вместо &row.

filename temp dde "excel|&xlssht.!r&row.c&col.:r%eval(&rows+&row+1)c%eval(&cols+&col)" ;
...