2012-07-30 17 views
5

Ich habe eine PROC EXPORT Frage, die ich frage mich, ob Sie antworten können.SAS: Begrenzende Variablen in PROC EXPORT

Ich habe ein SAS-Dataset mit 800+ Variablen und über 200K Beobachtungen und ich versuche, eine Teilmenge der Variablen in eine CSV-Datei zu exportieren (dh ich brauche alle Datensätze; Ich will nicht alle 800+ Variablen) . Ich kann immer ein temporäres Dataset "Keep" nur die Felder, die ich brauche, erstellen und EXPORT für dieses temporäre Dataset ausführen, aber ich versuche, den zusätzlichen Schritt zu vermeiden, weil ich eine große Anzahl von Datensätzen habe.

Um dies zu demonstrieren, betrachten Sie ein Dataset mit drei Variablen mit den Namen x, y und z. Aber ich möchte, dass die durch PROC EXPORT erzeugte Textdatei nur x und y enthält. Mein Versuch einer Lösung unten funktioniert nicht ganz.

Der SAS-Code

Wenn ich den folgenden Code ausführen, bekomme ich nicht genau, was ich brauche. Wenn Sie diesen Code ausführen und sich die generierte Textdatei ansehen, wird am Ende jeder Zeile ein Komma angezeigt, und der Header enthält sowieso alle Variablen im Dataset. Außerdem bekomme ich einige Nachrichten im Log, die ich nicht bekommen sollte.

Hier sind die ersten Zeilen der Textdatei, die erzeugt wurde ("C: \ test.csv")

x,y,z 
1,1, 
2,4, 
3,9, 
4,16, 

Die SAS Log

9343 proc export data=ds1(keep=x y) 
9344  file='c:\test.csv' 
9345  dbms=csv 
9346  replace; 
9347 quit; 

9348 /********************************************************************** 
9349 * PRODUCT: SAS 
9350 * VERSION: 9.2 
9351 * CREATOR: External File Interface 
9352 * DATE:  30JUL12 
9353 * DESC:  Generated SAS Datastep Code 
9354 * TEMPLATE SOURCE: (None Specified.) 
9355 ***********************************************************************/ 
9356  data _null_; 
9357  %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ 
9358  %let _EFIREC_ = 0;  /* clear export record count macro variable */ 
9359  file 'c:\test.csv' delimiter=',' DSD DROPOVER lrecl=32767; 
9360  if _n_ = 1 then  /* write column names or labels */ 
9361  do; 
9362   put 
9363   "x" 
9364   ',' 
9365   "y" 
9366   ',' 
9367   "z" 
9368   ; 
9369  end; 
9370  set DS1(keep=x y) end=EFIEOD; 
9371   format x best12. ; 
9372   format y best12. ; 
9373   format z best12. ; 
9374  do; 
9375   EFIOUT + 1; 
9376   put x @; 
9377   put y @; 
9378   put z ; 
9379   ; 
9380  end; 
9381  if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */ 
9382  if EFIEOD then call symputx('_EFIREC_',EFIOUT); 
9383  run; 

NOTE: Variable z is uninitialized. 
NOTE: The file 'c:\test.csv' is: 
     Filename=c:\test.csv, 
     RECFM=V,LRECL=32767,File Size (bytes)=0, 
     Last Modified=30Jul2012:12:05:02, 
     Create Time=30Jul2012:12:05:02 

NOTE: 101 records were written to the file 'c:\test.csv'. 
     The minimum record length was 4. 
     The maximum record length was 10. 
NOTE: There were 100 observations read from the data set WORK.DS1. 
NOTE: DATA statement used (Total process time): 
     real time   0.04 seconds 
     cpu time   0.01 seconds 


100 records created in c:\test.csv from DS1. 


NOTE: "c:\test.csv" file was successfully created. 
NOTE: PROCEDURE EXPORT used (Total process time): 
     real time   0.12 seconds 
     cpu time   0.06 seconds 

Beliebig Ideen, wie ich dieses Problem lösen kann? Ich verwende SAS 9.2 auf Windows 7.

Jede Hilfe wäre willkommen. Vielen Dank.

  • Karthik
+0

Ich weiß, ich kann "Daten _null_; set ds1; Datei 'c: \ test.csv' dlm = ','; put x y; run;" um das zur Arbeit zu bringen. PROC-Export scheint attraktiv, da ich morgen statt einer CSV-Datei möglicherweise in ein Excel-Arbeitsbuch exportieren muss und die Option "Datenschritt" dann nicht funktioniert. – Karthik

+6

Ich weiß nicht, ob das funktioniert, also poste ich es als Kommentar. Können Sie einfach eine Datenansicht verwenden, um die gewünschte Untergruppe zu erstellen, und diese dann exportieren? Ich meine, können Sie eine Ansicht exportieren? Ich bin mir nicht sicher ... – itzy

+0

Das hat wie ein Zauber funktioniert! Ich werde das als Lösung veröffentlichen. Vielen Dank. – Karthik

Antwort

7

Sitz in Itzy Kommentar zu meiner Frage, hier ist die Antwort, und dies ist genau das, was ich brauche.

proc sql; 
    create view vw_ds1 as 
     select x, y from ds1; 
quit; 

proc export data=vw_ds1 
    file='c:\test.csv' 
    dbms=csv 
    replace; 
quit; 

Danke für die Hilfe!