2012-07-30 30 views
5

Tengo una pregunta PROC EXPORT que me pregunto si puede contestar.SAS: Limitar variables en PROC EXPORT

Tengo un conjunto de datos SAS con más de 800 variables y más de 200K observaciones y estoy tratando de exportar un subconjunto de las variables a un archivo CSV (es decir, necesito todos los registros; simplemente no quiero las más de 800 variables) . Siempre puedo crear un conjunto de datos temporal "MANTENER" solo los campos que necesito y ejecutar la EXPORTACIÓN en ese conjunto de datos temporales, pero estoy tratando de evitar el paso adicional porque tengo una gran cantidad de registros.

Para demostrar esto, considere un conjunto de datos que tenga tres variables llamadas x, y y z. Pero, quiero que el archivo de texto generado a través de PROC EXPORT contenga solamente x e y. Mi intento de una solución a continuación no funciona del todo.

El Código SAS

Cuando ejecuto el siguiente código, que no entiendo exactamente lo que necesito. Si ejecuta este código y mira el archivo de texto que se generó, tiene una coma al final de cada línea y el encabezado incluye todas las variables en el conjunto de datos de todos modos. Además, recibo algunos mensajes en el registro que no debería recibir.

Estas son las primeras líneas del archivo de texto que se ha generado ("C: \ test.csv")

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

El Registro de SAS

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 

Cualquier ideas de cómo puedo resolver este problema? Estoy ejecutando SAS 9.2 en Windows 7.

Cualquier ayuda sería apreciada. Gracias.

  • Karthik
+0

Me doy cuenta de que puedo usar "data _null_; set ds1; file 'c: \ test.csv' dlm = ','; put x y; run;" para hacer que esto funcione La exportación de PROC parece atractiva porque es posible que necesite exportar a un libro de trabajo de Excel mañana en lugar de un archivo CSV y la opción "paso de datos" no funcionará en ese momento. – Karthik

+6

No sé si esto funciona, entonces lo estoy publicando como comentario. ¿Puedes usar una vista de datos para crear el subconjunto que deseas y luego exportarlo? Quiero decir, ¿puedes exportar una vista? No estoy seguro ... – itzy

+0

¡Eso funcionó como un encanto! Voy a publicar eso como la solución. Gracias. – Karthik

Respuesta

7

Basado en el comentario de Itzy a mi pregunta, aquí está la respuesta y esto es exactamente lo que necesito.

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; 

¡Gracias por la ayuda!