2012-07-30 16 views
5

Ho una domanda PROC EXPORT che mi chiedo se è possibile rispondere.SAS: variabili di limitazione in PROC EXPORT

Ho un set di dati SAS con oltre 800 variabili e oltre 200K di osservazioni e sto tentando di esportare un sottoinsieme delle variabili in un file CSV (cioè ho bisogno di tutti i record, io non voglio tutte le 800+ variabili) . Posso sempre creare un set di dati temporaneo "TENERE" solo i campi di cui ho bisogno ed eseguire EXPORT su quel set di dati temporaneo, ma sto cercando di evitare il passaggio aggiuntivo perché ho un gran numero di record.

Per dimostrarlo, prendere in considerazione un set di dati con tre variabili denominate x, y e z. Ma voglio che il file di testo generato attraverso PROC EXPORT contenga solo x e y. Il mio tentativo di una soluzione qui sotto non funziona del tutto.

Il Codice SAS

Quando eseguo il seguente codice, non ottengo esattamente quello che mi serve. Se si esegue questo codice e si guarda il file di testo che è stato generato, ha una virgola alla fine di ogni riga e l'intestazione include comunque tutte le variabili nel set di dati. Inoltre, ottengo alcuni messaggi nel registro che non dovrei ottenere.

Ecco le prime righe del file di testo che è stato generato ("C: \ test.csv")

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

Il 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 

Qualsiasi idee su come posso risolvere questo problema? Sto eseguendo SAS 9.2 su Windows 7.

Qualsiasi aiuto sarebbe apprezzato. Grazie.

  • Karthik
+0

Mi rendo conto che posso utilizzare "data _null_; imposta ds1; file 'c: \ test.csv' dlm = ','; metti x y; run;" per farlo funzionare. PROC Export sembra interessante perché potrebbe essere necessario esportare domani in una cartella di lavoro Excel anziché in un file CSV e l'opzione "passaggio dati" non funzionerà. – Karthik

+6

Non so se questo funziona, quindi lo sto postando come commento. Puoi semplicemente utilizzare una visualizzazione dati per creare il sottoinsieme che desideri e quindi esportarlo? Voglio dire, puoi esportare una vista? Non sono sicuro ... – itzy

+0

Ha funzionato come un incantesimo! Lo posterò come soluzione. Grazie. – Karthik

risposta

7

sede a commento di Itzy alla mia domanda, ecco la risposta e questo fa esattamente quello che mi serve.

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; 

Grazie per l'aiuto!

Problemi correlati