SAS Daten per Remote SUBMITE vom Großrechner selektieren, DOWNLOAD zum PC und EXPORT in EXCEL
Immer wieder wurde es notwenig Daten auf dem Großrechner zu selektieren und diese anschließend der Fachabteilung zur Verfügung zu stellen. Da die Daten meist weiterverarbeitet wurden, bestand der Wunsch, sie in einem Microsoft gerechtem Vormat zu haben, in EXCEL. Anbei meine Lösung, die auch mit der Schwierigkeit der Umlaute zurecht kommt.
options comamid=TCP;
%let server=e003.esb.eur.deuba.com 5030;
options remote=server;
%*** Signon mit einer voreingestellen Userid (im Popupfenster noch aenderbar);
%*** und noch einzugebendem Passwort (erscheint leer);
signon user=APH090 password=_prompt_;
%*** Lege hier den Pfand und den Namen der Excelausgabedatei fest;
%let locDir = %str(C:\Temp);
%let excelfile=TestDatei;
%*** Remote Submit, dieses Statement wird nur auf dem HOST verarbeitet;
rsubmit;
Libname TestAlloc "&sysuid..testlib.sas" disp=shr;
%*** Translation Table EBCDIC ==> ASCII;
proc trantab table=ebcdic;
rep 074 138 /*Ä*/; rep 190 100 /*´*/; rep 253 177 /*Ù*/;
rep 224 174 /*Ö*/; rep 160 101 /*µ*/; rep 254 178 /*Ú*/;
rep 090 180 /*Ü*/; rep 182 102 /*¶*/; rep 251 179 /*Û*/;
rep 192 188 /*ä*/; rep 179 103 /*·*/; rep 173 181 /*
- Anmelden oder Registrieren um Kommentare zu schreiben

Fehlerkorrektur und Verbesserung des Macros "AUSGABE"
%macro ausgabe(dat, Exceltab=Sonderauswertung, Einzeln=No);
%if %sysfunc(exist(&dat.)) %then %do;
%let n=0;
proc sql UNDO_POLICY=none noprint;
select count(*) into :N from &dat. ;
quit;
%if &N. > 0 %then %do;
%if &Einzeln. = %str(Yes) %then %do;
proc export data=&dat.
outfile="&locDir.\Excel\&dat..xls"
dbms=excel2000 replace;
run;
%end;
%else %do;
proc export data=&dat.
outfile="&locDir.\Excel\&exceltab..xls"
dbms=excel2000 replace; sheet=&dat.;
run;
%end;
%end;
%else %do;
%put WARNING: Datei &dat. ist leer.;
%end;
%end;
%else %do;
%put ERROR: Datei &dat. existiert nicht!;
%put ERROR: Datei &dat. existiert nicht!;
%put ERROR: Datei &dat. existiert nicht!;
%end;
%mend;
Download nach Excel 2000 mit Label
Hallo,
in diesem Zusammenhang habe ich dann auch gleich noch eine Frage: Gibt es unter SAS8 eine Möglichkeit, PROC EXPORT bei Ausgabe für Excel 2000 mit einer LABEL-option zu versehen? Im Moment nutze ich entweder
OUTFILE= "&PFAD"
DBMS=EXCEL2000 REPLACE;
RUN;
dann erfolgt die Ausgabe mit 65.536 Zeilen aber ohne Label, d. h. mit den 8stelligen, nicht immer sprechenden Variablennamen
oder
PATH = "&PFAD";
PUTNAMES YES;
LIMIT = 0;
LABEL;
RESET ALL;
LOAD;
RUN;
mit der Ausgabe von maximal 16.383 Datensätzen, dafür mit Label.
Gruss, F. Grohmann
Geht im PROC EXPORT nicht, Excelausgabe mit Label
Hallo,
selbst in SAS 9 gibt es das scheinbar nicht. Man findet in der Hilfe:
Restriction: PROC EXPORT does not support writing labels as column names. However, SAS does support column names up to 32 characters.
Man könnte sich eine Eigenlösung basteln etwa in der Art, 1. OBS enthält das Label, was man z.B. aus "PROC CONTENTC" erhalten könnte und ab der 2. OBS stehen dann die Daten, die man dann vorher auch noch in CHAR-Variablen ausgeben müsste. Sicher nicht die beste Lösung aber bei einfachen Daten funktioniert es. Anbei ein Vorschlag:
%if &exceltab.=%str() %then %let exceltab=&dat.;
%if %sysfunc(exist(&lib..&dat.)) %then %do;
%let n=0;
proc sql UNDO_POLICY=none noprint;
select count(*) into :N from &lib..&dat. ;
quit;
%if &N. > 0 %then %do;
proc contents data=&lib..&dat.
out =cont(keep=length name label type memname
format formatd formatl) noprint;
run;
data cont(keep=nam len for lab typ memname);
format for $12.;
set cont;
for=compress(format)!!compress(put(formatl,5.))!!'.';
if formatd > 0 then
for=compress(for)!!compress(put(formatd,3.));
if format = ' ' then do;
select(type);
when(1) for=compress(put(length,5.)!!'.');
when(2) for=compress('$'!!put(length,5.)!!'.');
otherwise for=' ';
end;
end;
if label = '' then label = upcase(name);
rename length=len label=lab name=nam type=typ;
run;
proc sort data=cont nodupkey;
by memname nam len for lab;
run;
data _null_;
set cont end = fertig;
call symput(compress('n'!!put(_N_,4.)),compress(nam));
call symput(compress('l'!!put(_N_,4.)),compress(put(len,4.)));
call symput(compress('f'!!put(_N_,4.)),compress(for));
call symput(compress('t'!!put(_N_,4.)),compress(put(typ,1.)));
call symput(compress('lab'!!put(_N_,4.)),trim(lab));
if fertig then do;
call symput('memname',trim(memname));
call symput('anz',put(_N_,8.));
end;
run;
data &memname.;
length %do i = 1 %to &anz.; col&i. %end; $&maxl.;
set &lib..&dat.;
if _N_ = 1 then do;
%do j = 1 %to &anz.;
col&j. = "&&lab&j.";
%end;
output;
end;
%do k = 1 %to &anz.;
%if &&t&k. = 2 %then col&k. = &&n&k.;
%else col&k. = put(&&n&k.,&&f&k..);;
%end;
output;
keep col:;
run;
%if &Einzeln. = %str(Yes) %then %do;
proc export data=&memname.
outfile="&locDir.\&memname..xls"
dbms=excel2000 replace;
run;
%end;
%else %do;
proc export data=&dat.
outfile="&locDir.\&exceltab..xls"
dbms=excel2000 replace; sheet=&memname.;
run;
%end;
%end;
%else %do;
%put WARNING: Datei &lib..&dat. ist leer.;
%end;
%end;
%else %do;
%put ERROR: Datei &lib..&dat. existiert nicht!;
%put ERROR: Datei &dat. existiert nicht!;
%put ERROR: Datei &dat. existiert nicht!;
%end;
%mend;
/***
%*** Verwendung z.B. so: ;
%let locDir = %str(C:\);
libname locDIR "&locDIR.";
data locDIR.testdat;
length asset_num opendate $10 Testfeld $25 nr 8 ;
label asset_num = 'Filialkundennummer'
opendate = 'Eröffnungsdatum'
testfeld = 'Testfeld für Feldlänge'
nr = 'Nummer';
input asset_num $ opendate $ testfeld $ nr;
datalines;
100/111111 01.01.2000 Testfeld_für_FeldlängeNr. 1
200/222222 02.02.2000 Testfeld_für_FeldlängeNr. 2
300/333333 03.03.2000 Testfeld_für_FeldlängeNr. 3
400/444444 04.04.2000 Testfeld_für_FeldlängeNr. 4
500/555555 05.05.2000 Testfeld_für_FeldlängeNr. 5
600/666666 06.06.2000 Testfeld_für_FeldlängeNr. 6
700/777777 07.07.2000 Testfeld_für_FeldlängeNr. 7
800/888888 08.08.2000 Testfeld_für_FeldlängeNr. 8
900/999999 09.09.2000 Testfeld_für_FeldlängeNr. 9
;
run;
%Excelaus(lib=locDir, dat=Testdat);
***/
Einziger Wermutstropfen, Zahlen sind nun Zeichen mit führenden "'"...
und in der ersten Excelzeile stehen die Hilfsfeldnamen COL1 ... COLN.
Ich hoffe Ihnen damit geholfen zu haben.
MfG Ralph Gottschald
Kybeidos GbmH