SAS ODS Excel Speicherproblem

21. März 2024

Ausgangslage

ODS EXCEL ist praktisch beim Erstellen von Excel-Tabellen aus SAS heraus, da es viele Möglichkeiten bietet auf das Aussehen der Excel-Datei Einfluss zu nehmen.

Leider ist ODS Excel nicht geeignet eine größere Menge von Datensätzen nach Excel zu exportieren. Im Gegensatz zu den alten ODS ExcelTagsets (zur Generierung von Excel-Dateien im alten Format .xls) verbraucht ODS Excel sehr viel Hauptspeicher.

Oftmals wird einer SAS-Session nur ein Hauptspeicher von 2 GB zugewiesen was in etwa für eine Tabelle mit knapp 40.000 Sätzen und 15 Spalten reicht.

Was allerdings tun, wenn alle anderen Wege (DDE, X-Commands zum triggern von VBA Code, …)

nicht gewünscht oder verstellt sind?

Es existiert noch eine Möglichkeit für den SAS-Anwender eine Session mit mehr als 2GB Hauptspeicher zu öffnen. Dies kann über SAS Connect geschehen, auch wenn man hier vorsichtig sein sollte, da mehr Ressourcen allokiert werden als vom SAS-Administrator für jeden User vorgesehen sind.

Parameter

Parameter des Makros

LIBNAME: Speicherort der zu exportierenden Tabelle. Die SAS Library muss eine permanente Library sein, Work kann nicht verwendet werden.

DSN: Name des zu exportierenden SAS-Datasets.

PATH: Pfad unter dem die Excel-Datei erzeugt werden soll.

FILENAME: Name der anzulegenden Excel-Datei inklusive Endung.

Makrocode

Testdaten erzeugen

Dieses Makro erzeugt Testdaten mit über 100.000 Zeilen und 15 Spalten aus der Tabelle SASHELP.CARS.

%MACRO testdata;

DATA XWORK.TESTDATA;
SET
%DO i=1 %TO 260;
SASHELP.CARS %NRSTR( )
%END;
;
RUN;

%MEND;



%testdata;

Excel in Remote-Session erzeugen

Das folgende Makro öffnet remote eine SAS-Session auf dem SAS-Server mit 8 GB allokiertem Hauptspeicher.

/* Das Makro öffnet eine Remote Session auf dem Server mit mehr Speicherplatz */
/* Damit kann ODS ca. 111.280 Zeilen bei 15 Spalten nach Excel schreiben mit 8GB Memsize in Session */

%MACRO ODS_EXCEL_CLEAN (LIBNAME=XWORK, DSN=SASHELP, PATH=…\usr$\X123\, FILENAME=TEST.xlsx);

/* Das folgende options Statement sorgt dafür, dass 8 GB für die Remote-Session allokiert werden */

options sascmd="sas -memsize 8G" mprint symbolgen;

/* Die Remote Session wird mit dem Namen EXCEL_CL über das signon Statement gestartet */

signon EXCEL_CL;

/* Makrovariablen müssen von der lokalen Session an die Remote-Session übergeben werden. Dies geschieht mit %SYSLPUT */

%syslput DSN=&DSN / remote=EXCEL_CL;
%syslput PATH=&PATH / remote=EXCEL_CL;
%syslput FILENAME=&FILENAME / remote=EXCEL_CL;
%syslput LIBNAME=&LIBNAME / remote=EXCEL_CL;

/* Übergabe des auszuführenden Codes per rsubmit. Inheritlib= Vererbt eine in der lokalen Session allokierte SAS Bibliothek an die Remote-Session */

rsubmit EXCEL_CL INHERITLIB=(&LIBNAME.=&LIBNAME.);

/* Alle Ausgabemöglichkeiten von ODS schließen */

ODS _ALL_ CLOSE;

/* Excel als Ausgabemöglichkeit öffnen */

ODS EXCEL FILE="&PATH.&FILENAME" options(
sheet_name="Tabelle"
sheet_interval='NONE'
);

/* schreiben der Testdaten über einfachen Proc Print */

PROC PRINT NOOBS
DATA=&&LIBNAME..&DSN;
run;

/* Excel Ausgabemöglichkeit schließen */

ODS EXCEL CLOSE;

/* Eine Ausgabemöglichkeit von ODS öffnen, damit bei weitere Codeausführung Ausgaben angezeigt werden. Leider ist mir keine Möglichkeit bekannt an dieser Stelle die Standardausgabemöglichkeit wieder anzuschalten */

ODS LISTING;

/* Beenden der Codeübertragung mittels endrsubmit */

endrsubmit ;

/* Abemelden von der Remotesession per signoff */

signoff;

%MEND;


Beispielaufruf  


%ODS_EXCEL_CLEAN (LIBNAME=XWORK, DSN=TESTDATA, PATH=…\usr$\X123\\, FILENAME=TEST.xlsx);

cross-circleCookie Consent Banner von Real Cookie Banner