2012-07-30 7 views
5

Mam pytanie PROC EXPORT, zastanawiam się, czy możesz odpowiedzieć.SAS: Ograniczanie zmiennych w PROC EXPORT

Mam zestaw danych SAS z ponad 800 zmiennych i ponad 200K obserwacji i próbuję wyeksportować podzestaw zmiennych do pliku CSV (tj. Potrzebuję wszystkich rekordów, po prostu nie chcę wszystkich 800 + zmiennych) . Zawsze mogę utworzyć tymczasowy zestaw danych "KEEP", używając tylko tych pól, których potrzebuję, i uruchom EKSPORT na tym pliku danych tymczasowych, ale próbuję uniknąć dodatkowego kroku, ponieważ mam dużą liczbę rekordów.

Aby to wykazać, należy rozważyć zestaw danych zawierający trzy zmienne o nazwach x, yiz. Ale chcę, aby plik tekstowy wygenerowany przez PROC EXPORT zawierał tylko xiy. Moja próba rozwiązania poniżej nie działa.

Kodeks SAS

Kiedy uruchomić poniższy kod, nie dostać dokładnie to, czego potrzebuję. Jeśli uruchomisz ten kod i spojrzysz na plik tekstowy, który został wygenerowany, na końcu każdej linii ma przecinek, a mimo to nagłówek zawiera wszystkie zmienne w zbiorze danych. Ponadto dostaję trochę komunikatów do dziennika, których nie powinienem otrzymywać.

Oto kilka pierwszych linii pliku tekstowego, który został wygenerowany ("C: \ test.csv")

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

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 

Any pomysły, jak mogę rozwiązać ten problem? Używam SAS 9.2 w Windows 7.

Każda pomoc będzie doceniona. Dzięki.

  • Karthik
+0

Zdaję sobie sprawę, że mogę użyć "danych _null_; ustawić ds1; plik" c: \ test.csv "dlm =", "; umieścić x y; uruchomić;" aby to zadziałało. Eksport PROC wydaje się atrakcyjny, ponieważ może być konieczne wyeksportowanie do skoroszytu programu Excel jutro zamiast pliku CSV, a opcja "krok danych" nie będzie wtedy działała. – Karthik

+6

Nie wiem, czy to działa, więc zamieszczam to jako komentarz. Czy możesz po prostu użyć widoku danych do utworzenia podzestawu, który chcesz, a następnie wyeksportować? Mam na myśli, czy możesz wyeksportować widok? Nie jestem pewien ... – itzy

+0

To działało jak czar! Powiem to jako rozwiązanie. Dzięki. – Karthik

Odpowiedz

7

siedzibą w komentarzu Itzy do mojego pytania, oto odpowiedź i to jest dokładnie to, czego potrzebuję.

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; 

Dzięki za pomoc!