Wie kann ich die Ausgabe als Excel speichern?

Zum Beispiel, ich erstelle Kreuztabellen mit proc freq (tables var1*var2). Die Ausgabe kann ich als RTF speichern, aber dann kann ich die Zahlen nicht weiter bearbeiten (im Sinne Prozente bilden und Ähnliches). Besteht es die Möglichkeit, die Ausgabe als Excel-Tabelle zu speichern?
Danke im Voraus.

ODS HTML oder auch spezielle Tag sets

Hallo DrBoogie,

dazu gab es kürzlich schon einmal einen Eintrag. Ich selbst benutze immer ODS HTML, die Dateien lassen sich prima in Excel öffnen und bearbeiten.

In einem Beitrag ging es vor kurzem um das Speichern einer Excel-Datei mit mehreren Arbeitsblättern (http://www.redscope.org/node/623), dort wurde auf spezielle Excel Tagsets verwiesen.

Gruß,
Ulrike Grömping

Danke, Ulrike! Aber das ist

Danke, Ulrike!
Aber das ist leider nicht ganz, was ich will. Denn wenn ich ODS HTML benutze, bekomme ich zwar meine Tabellen in Excel, aber halt nicht als Excel-Tabellen, sondern kommen alle Spalten in eine Spalte.
Nochmals, um etwas Klarheit zu schaffen: ich habe als Ausgabe Kreuztabellen, und ich brauche sie in Excel als Excel-Tabellen, d.h. jede Excel-Zelle soll nur eine Zahl enthalten, und nicht die ganze Reihe.

XLS-Ausgabe mit ODS (Trick 17, aber klappt)

Hallo,
bei uns ist der ODS-Trick 17 schon "seit ewig" im Einsatz und klappt prima:

ods html body="test_tabulate.xls" /* HIER MUSS WAS REIN siehe unten*/;
data tmp_SD1;            /* Test-Daten */
    
input x $2. y $1. z;
cards;
aa11
bb22
cc33
;
run;
title2 "Kreuztabelle ('tabulate', je Y-Wert eine DoppelSpalte mit 'Sum(Z) & Anz')";
options linesize=80;
proc tabulate data=tmp_SD1 MISSING ;
  
class X Y;                  /* Gruppierungs-Variablen */
  
var   Z;                    /* Z ist für Zellen-Summe */
  
table
        
X                     /* "runter" */
        
ALL
        ,
        Y  *(Z*SUM*f=
commax6.2 N*f=commax5.)  /* "quer", DoppelSp.je Y */
        
ALL*(Z*SUM*f=commax6.2 N*f=commax5.)  /* mit "Sum(Z) & Anz" */
        
/ rts=9               /* rts = RowTableSize */
                              
/*     = TextSp.Breite, incl. BegrStr. */
  
;
  
keylabel SUM='Summe' N='Anz.' ALL='Gesamt';
  
label
       
X='Var X'
       
Y='Y-Wert'
       
Z='Z-Wert'
  
;
run;
ods html close;
ACHTUNG: Die Stelle /* HIER MUSS WAS REIN siehe unten*/ muss s t y l e = e x c e l lauten (natürlich ohne die Blancs dazwischen, aber ohne diesen Trick 17 spinnt die Forums-Software!) ...
Die Ausgabe sieht aus wie eine Excel-Ausgabe (test_tabulate.xls), ist aber html. Man kann damit rechnen u.s.w. und beim speichern fragt Excel ob man das "falsche" Format überschreiben will. Nach "OK" ist die xls-Datei eine echte Excel-Datei.
Gruß

Hans Kneilmann, Schäfer Shop GmbH (SSI)

Entschuldigung, aber ich

Entschuldigung, aber ich kriege es trotzdem nicht auf die Reihe, weil ich nicht verstehe, welche Stelle im Programm dafür verantwortlich ist, dass alle Zahlen in getrennte Zellen kommen. Bei mir kommen immer noch die ganzen Zeilen in eine Zelle. Ich habe dabei das Programm oben nicht eins zu eins übernommen, weil ich es in dieser Form nicht gebrauchen kann.
Mein Programm sieht so aus (ich lasse ods html-Befehle hier weg):

proc tabulate data= ;
class var1--var100;
tables var1*var2 var1*var3 ... var1*var100;
run;

Ich brauche keine Labels, keine Summen, nix, nur die Kreuztabellen mit Zahlen. Was muss ich noch zu meinen Programm dazufügen, damit es funktioniert? Oder geht es nur sehr umständlich?
Danke im Voraus.

Test-Daten und Test-Programm ?

Hallo "name",
das Problem liegt doch genau beim ODS html-Befehl .... !
Deshalb hift "ich lasse ods html-Befehle hier weg" hier überhaupt nicht.
Frage: Klappt den das Programm mit normaler Ausgabe, also ohne ODS und lst-/txt-Datei (im Batch) oder OUT-Fenster im SAS Display Manager?
Wie soll denn die falsche und wie die richtige Ausgabe aussehen?
Wie sieht denn das ganze Programm, aber bitte reduziert und ohne 100 Variablen, dafür mit Test-Daten, aus ?
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Das volle Programm sieht so

Das volle Programm sieht so aus (verkürzte Version, mit nur 2 Variablen):

ODS html body="C:/pfad/ausgabe.xls" style=excel;
options linesize=120;
rsubmit;
proc tabulate data=bla.bla;
class var1 var2;
table var1*var2;
run;
endrsubmit;
ODS html CLOSE;

Dieses Programm funktioniert und liefert eine Excel-Datei, wo die Kreuztabelle auch zu sehen ist, aber leider nicht als Excel-Tabelle, womit ich meine, dass die Zahlen nicht in getrennten Zellen stehen, sondern dass die Ganze Tabelle in erster Spalte steht, d.h. die Zelle A7, z.B., sieht so aus: | 611.00| 9500.00| 3713.00| 3174.00| 2064.00| 1077.00| 960.00|. Ich brauche aber diese Zahlen in 7 verschiedenen Zellen: A7, B7 usw. bis G7, damit ich sie im Excel weiter bearbeiten kann. Das Problem ist also nicht, dass ich keine Excel-Ausgabe bekomme, sondern dass ich keine "normale" Excel-Ausgabe bekomme, die ich z.B. mit SPSS bekommen hätte.
Die Ausgabe in Ihrem Programm sieht aber ganz normal aus, nur verstehe ich nicht, wo der Unterschied liegt. Ich benutze dieselben ODS HTML Befehle, also dachte ich, soll der Unterschied in proc tabulate selber liegen. Entschuldigung, dass ich so primitive Fragen stelle. In SAS ist es halt oft schwierig, auch auf primitive Fragen Antworten zu finden. :(

P.S. Übrigens, mein "Name", zumindest Vorname, ist Denis, was man relativ einfach erfahren kann, wenn man mein Konto aufmacht. :))

rsubmit

RSUBMIT und ENDRSUBMIT führen das Programm ja via SAS/CONNECT auf Ihrem Server aus. Wenn man es macht wie in Ihrem Beispiel, wird eine reine Textdatei vom Server an den Client übertragen und diese anschließend mit Hilfe der ODS-Anweisungen in eine HTML-Datei umgewandelt. Auf diesem Weg gehen die Spaltentrennungen etc. verloren. Folgendes ergibt in Excel also eine unbrauchbare Ansicht:

ods html file='c:\temp\class.xls';
rsubmit;
proc print data=sashelp.class;
run;
endrsubmit;
ods html close;
Schreibt man die ODS-Anweisungen auch zwischen RSUBMIT und ENDRSUBMIT, so wird die HTML-Datei mit der Endung xls zwar korrekt erzeugt, aber auf dem Server. Man kann sie dann wieder mit PROC DOWNLOAD auf den Client herunterladen. Im Folgenden ist zu beachten, dass sich 'c:\temp' einmal auf den Client und einmal auf den Server bezieht, also auf getrennte Maschinen.
rsubmit;
ods html file='c:\temp\class.html';
proc print data=sashelp.class;
run;
ods html close;
proc download
   
infile='c:\temp\class.html' /* steht auf dem Server */
   
outfile='c:\temp\class.xls' /* steht auf dem Client */
;
run;
endrsubmit;

Vielen Dank, ich habe es

Vielen Dank, ich habe es schon so gemacht (proc download brauche ich nicht, ich habe einfach ein passendes Dateitausch-Programm).

Auch mit PROC FREQ und ODS HTML funktioniert es bei mir

Hallo Denis,

ich kann nicht nachvollziehen, was Dein Problem ist. Bei mir funktioniert die Ausgabe so, dass jede Zahl in ihrer eigenen Zelle steht, und das sogar ohne "style=excel".

Beispielprogramm:

ods html body="c:\test_freq.xls";
data tmp_SD1; /* Test-Daten */
input x $ y $ haeuf;
cards;
a a 11
b a 22
a b 33
b b 44
;
run;
proc freq data=tmp_SD1;
table x*y;
weight haeuf;
run;
ods html close;

Gruß, Ulrike

rsubmit und lokales ODS

Hallo Dennis,
mit dem Deinem o.g. Beispielprogramm klappt es bei mir auch nicht, aber überhaupt nicht! Die xls-Datei hat 1KB und ist leer.
Wenn ich in dem Programm die rsubmit und endrsubmit wegmache:

ODS html body="C:/ausgabe.xls";
options linesize=120;
*rsubmit;
data blabla;            /* Test-Daten */
    
input var1 $2. var2 $1. z;
cards;
aa11
bb22
cc33
;
run;

proc tabulate data=blabla;
class var1 var2;
table var1*var2;
run;
*endrsubmit;
ODS html CLOSE;
klappt es prima!
Vielleicht liegt da Dein Problem. Wozu soll das rsubmit gut sein ? (in Deinem Fall, nicht generell!)
Ich würde nie auf die Idee kommen ODS-Befehle lokal und den proc tabulate (oder proc freq oder ...) dazu remote wegzuschicken.... Entweder beides lokal oder beides remote!
Probier' es doch bitte mal aus, vielleicht klappt's ...
Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Danke, das war es! Habe

Danke, das war es! Habe nicht gedacht, dass lokale Ausführung von ODS so ein Effekt haben kann (warum es so ist, verstehe ich immer noch nicht). Aber auf jeden Fall klappt es, wenn ich alles remote mache. Vielen Dank!

Das rsubmit benutze ich, weil ich alle remote, auf einem ziemlich weit entferntem Rechner, machen muss. Aus zwei Gründen: erstens habe ich einfach nicht genug Platz lokal (es geht um viele-viele GB), und zweitens ist der "weit entfernter" Rechner um vielfaches leistungsfähiger. Lokal würde bei mir jeder Sortierungsvorgang ein paar Stunden dauern. :(