Daten trennen und exportieren

Auf Grund eines Merkmals trenne ich einen Datensatz in mehrere Dateien

DATA _NULL_;
set Work.SMplus end=EOF;
BY Merkmal;
IF FIRST.Merkmal then DO;
FLAG +
1;
CALL SYMPUT('var'||LEFT(flag),Merkmal);
END;
IF EOF then CALL SYMPUT('tot',FLAG);
RUN;

%macro groups;
DATA
%do i=1 %to &tot;
Out%left(&&var&i)
%end;    
;       
SET Work.SMplus;
%DO i=1 %to &tot;
IF Merkmal=
"&&var&i" then OUTPUT Out%left(&&var&i);
%END;
RUN;
%mend groups;
%groups

Nun möchte ich gern noch diese Einzeldateien in Excel exportieren. Sowohl als Einzeldateien, als auch alle SAS-Dateien in einer Excel-Datei mit mehreren Blättern.

Letztendlich sollen daraus Serienbriefe in Word beliefert werden.

Kann mir dazu jemand weiterhelfen?

Vielen Dank im voraus.

Z. B. PROC EXPORT

Das läßt sich u.a. leicht mit PROC EXPORT realisieren, setzt dann aber glaube ich eine Lizenz für Access/PC Files voraus. Die vorherige Aufslittung in einzelne Dateien ist dafür übrigens nicht unbedingt erforderlich; dies läßt sich auch über die sog. data set options erreichen.
Das ganze könnte dann z.B. so aussehen

%MACRO groups();

%LOCAL MerkmalLst NMerkmal i;

proc sql noprint;
select distinct(sex) INTO : MerkmalLst separated by
" " FROM sashelp.class;
/* Leerzeichengetrennte Liste der unterschiedlichen Werte der Variablen sex */
select count(distinct(sex)) INTO : NMerkmal FROM sashelp.class;
/* Anzahl der unterschiedlichen Werte der Variablen sex */
QUIT;

%DO i = 1 %TO &NMerkmal;
%LET merkmal = %scan(&MerkmalLst,&i); /* Extrahiert das i-te Element aus &MerkmalLst */
    
/* Export in einzelne Excel-Datei */
    
PROC EXPORT data = sashelp.class(where=(sex="&merkmal"))
        dbms = excel2000
        outfile =
"<Pfad>\_&merkmal..xls"
        
replace;
    SHEET = _&merkmal;
/* Name des Tabellenblatts */
    
RUN;

    
/* Export eine Gesamtdatei */
    
PROC EXPORT data = sashelp.class(where=(sex="&merkmal"))
        dbms = excel2000
        outfile =
"<Pfad>\gesamt.xls"
        
replace;
    SHEET = _&merkmal;
    RUN;
%END;
%MEND groups;
Viele Grüße

Fehler im Ablauf

Vielen Dank für die schnelle Hilfe!
Leider läuft der Code nicht ganz korrekt durch.
Ich habe es folgendermaßen angepasst:

%MACRO groups();

%LOCAL BezirkLst NBezirk i;

proc sql noprint;
select distinct(Bezirk) INTO : BezirkLst separated by
" " FROM work.smplus;
/* Leerzeichengetrennte Liste der unterschiedlichen Werte der Variablen sex */
select count(distinct(Bezirk)) INTO : NBezirk FROM work.smplus;
/* Anzahl der unterschiedlichen Werte der Variablen sex */
QUIT;

%DO i = 1 %TO &NBezirk;
%LET Bezirk = %scan(&BezirkLst,&i); /* Extrahiert das i-te Element aus &MerkmalLst */
    
/* Export in einzelne Excel-Datei */
    
PROC EXPORT data = work.smplus(where=(Bezirk="&Bezirk"))
        dbms = excel2000
        outfile =
"L:\SAS Bibliothek\_&Bezirk..xls"
        
replace;
    SHEET = _&Bezirk;
/* Name des Tabellenblatts */
    
RUN;

    
/* Export eine Gesamtdatei */
    
PROC EXPORT data = work.smplus(where=(Bezirk="&Bezirk"))
        dbms = excel2000
        outfile =
"L:\SAS Bibliothek\gesamt.xls"
        
replace;
    SHEET = _&Bezirk;
    RUN;
%END;
%MEND groups;
%groups;

Fehlermeldung:
HINWEIS: Neue Datei "L:\SAS Bibliothek\_113229.xls" wird
nach erfolgreichem Export erstellt.
1 Das SAS System 17:43 Thursday, February 7, 2008

FEHLER: Operator für Where-Bedingung erfordert kompatible Variablen.
HINWEIS: PROZEDUR EXPORT benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.64 Sekunden
CPU-Zeit 0.12 Sekunden

FEHLER: Export nicht erfolgt. Einzelheiten siehe SAS-Log.
HINWEIS: Das SAS System hat die Verarbeitung dieses Schritts aufgrund von Fehlern abgebrochen.

HINWEIS: Neue Datei "L:\SAS Bibliothek\gesamt.xls" wird
nach erfolgreichem Export erstellt.
1 Das SAS System 17:43 Thursday, February 7, 2008

FEHLER: Operator für Where-Bedingung erfordert kompatible Variablen.
HINWEIS: PROZEDUR EXPORT benötigt. (Gesamtverarbeitungszeit):
Echtzeit 0.21 Sekunden
CPU-Zeit 0.11 Sekunden

FEHLER: Export nicht erfolgt. Einzelheiten siehe SAS-Log.
HINWEIS: Das SAS System hat die Verarbeitung dieses Schritts aufgrund von Fehlern abgebrochen.

Was mache ich falsch?

Numerisch/alphanumerisch

Ihre Variable Bezirk enthält vermutlich numerische Werte wohingegen "sex" in meinem Beispiel alphanumerische Werte, also Text enthält. Die where-Bedingung muß also entsprechend angepaßt werden zu

where(bezirk=&Bezirk)
Die Unterscheidung numerisch/alphanumerisch läßt sich ggf. auch mit Hilfe der vartype() Funktion automatisieren.
Vorsicht ist im Falle alphanumerischer Merkmalswerte in Kombination mit separated by " " zudem geboten, wenn die Merkmalswerte selbst Leerzeichen enthalten. Dann wäre "separated by" und %scan() ggf. entsprechend anzupassen.

Vielen Dank

Es läuft wie gewünscht.
Herzlichen Dank!
Feider