SAS Daten per Remote SUBMITE vom Großrechner selektieren, DOWNLOAD zum PC und EXPORT in EXCEL

  • Einführung:
  • 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.

    %*** Option zum Zugang zur Testumgebung (Grossrechner der DB);
    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 /*�*/;
    rep 106 236 /*ö*/; rep 157 104 /*¸*/; rep 174 182 /*Þ*/;
    rep 208 252 /*ü*/; rep 218 105 /*¹*/; rep 068 184 /*à*/;
    rep 161 183 /*ß*/; rep 155 112 /*º*/; rep 069 185 /*á*/;
    rep 079 090 /*!*/; rep 139 113 /*»*/; rep 066 186 /*â*/;
    rep 181 124 /*@*/; rep 183 114 /*¼*/; rep 070 187 /*ã*/;
    rep 099 173 /*[*/; rep 184 115 /*½*/; rep 071 106 /*å*/;
    rep 236 224 /*\*/; rep 185 116 /*¾*/; rep 156 190 /*æ*/;
    rep 252 189 /*]*/; rep 171 117 /*¿*/; rep 072 191 /*ç*/;
    rep 067 192 /*{*/; rep 100 118 /*À*/; rep 084 202 /*è*/;
    rep 187 079 /*|*/; rep 101 119 /*�*/; rep 081 203 /*é*/;
    rep 220 208 /*}*/; rep 098 120 /*Â*/; rep 082 204 /*ê*/;
    rep 089 161 /*~*/; rep 102 128 /*Ã*/; rep 083 205 /*ë*/;
    rep 170 066 /*¡*/; rep 103 139 /*Å*/; rep 088 206 /*ì*/;
    rep 176 067 /*¢*/; rep 158 140 /*Æ*/; rep 085 207 /*í*/;
    rep 177 068 /*£*/; rep 104 141 /*Ç*/; rep 086 218 /*î*/;
    rep 159 069 /*¤*/; rep 116 142 /*È*/; rep 087 219 /*ï*/;
    rep 178 070 /*¥*/; rep 113 143 /*É*/; rep 140 220 /*ð*/;
    rep 204 071 /*¦*/; rep 114 144 /*Ê*/; rep 073 221 /*ñ*/;
    rep 124 072 /*§*/; rep 115 154 /*Ë*/; rep 205 222 /*ò*/;
    rep 189 073 /*¨*/; rep 120 155 /*Ì*/; rep 206 223 /*ó*/;
    rep 180 081 /*©*/; rep 117 156 /*�*/; rep 203 234 /*ô*/;
    rep 154 082 /*ª*/; rep 118 157 /*Î*/; rep 207 235 /*õ*/;
    rep 138 083 /*«*/; rep 119 158 /*�*/; rep 225 237 /*÷*/;
    rep 186 084 /*¬*/; rep 172 159 /*�*/; rep 112 238 /*ø*/;
    rep 202 085 /*-­*/; rep 105 160 /*Ñ*/; rep 221 239 /*ù*/;
    rep 175 086 /*®*/; rep 237 170 /*Ò*/; rep 222 250 /*ú*/;
    rep 188 087 /*¯*/; rep 238 171 /*Ó*/; rep 219 251 /*û*/;
    rep 144 088 /*°*/; rep 235 172 /*Ô*/; rep 141 253 /*ý*/;
    rep 143 089 /*±*/; rep 239 074 /*Õ*/; rep 142 254 /*þ*/;
    rep 234 098 /*²*/; rep 191 175 /*×*/; rep 223 255 /*ÿ*/;
    rep 250 099 /*³*/; rep 128 176 /*Ø*/;
    save table=e2a;
    quit;

    %*** Simple Datenselektionen;
    data testdat1; set testalloc.testdat1; run;
    data testdat2; set testalloc.testdat2; run;
    data testdat3; set testalloc.testdat3; run;

    %*** Simples Donload der selektierten Daten, vom HOST ==> PC;
    proc download data=testdat1 out=testdat1; trantab name=e2a; run;
    proc download data=testdat2 out=testdat2; trantab name=e2a; run;
    proc download data=testdat3 out=testdat3; trantab name=e2a; run;

    %*** Ende der Remote Submite;
    endrsubmit;

    %*** Ende der HOST Session;
    signoff;

    %*** Kleines Macro, was aus den SAS-Membern eine oder mehrere;
    %*** Exceldateien erstellt. Wahlweise stehen die Member in einer;
    %*** Exceldatei in unterschiedlichen Blättern oer in einzelnen ;
    %*** Exceldateie. Der Blatname ist gleich dem SAS-Membername;
    %macro ausgabe(dat, Exceltab=Sonderauswertung, Einzeln=No);
    %if Einzeln = %str(Yes) %then %do;
    proc export data=work.&dat. outfile="&locDir.\Excel\&dat..xls" dbms=excel2000 replace; run;
    %end;
    %else %do;
    proc export data=work.&dat. outfile="&locDir.\Excel\&exceltab..xls" dbms=excel2000; sheet=&dat.; run;
    %end;
    %mend;

    %*** Export nach Excel, hier in eine Datei mit drei Tabellen;
    %ausgabe(Testdat1,Exceltab=&excelfile. );
    %ausgabe(Testdat2,Exceltab=&excelfile. );
    %ausgabe(Testdat3,Exceltab=&excelfile. );

    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

    PROC EXPORT DATA=REMOTE.&SASDAT     
                
    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

    PROC     DBLOAD     DATA=REMOTE.&SASDAT DBMS=XLS;
         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:

    %macro Excelaus(lib=work, dat=, Exceltab=, Einzeln=YES);
    %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