2015-02-02 3 views
4

У меня есть набор данных в SAS, который содержит 20 лет данных. Я хочу экспортировать в файл csv за каждый год. Есть ли простой способ сделать это?SAS: экспортировать данные в несколько файлов csv по году

Вот что я делаю за один год сейчас (что наивный):

экспорта прок
данных = дц (где = (год = 2011)) выходной_файл = 'ds2011.csv' DBMS = CSV заменить;
run;

Большое спасибо!

ответ

2

Это была бы идеальная работа для SAS/Macro, которая позволяет замену текста на повторный код. См. Ниже решение (при условии, что диапазон дат 1991-2011 годов изменит операторы %let в соответствии с вашим диапазоном), с контуром макроса %do, который заменяет значение & dt. (1991-2011) в код, указанный в вашем вопросе.

%macro date_export; 
%let start_date = 1991; 
%let end_date = 2011; 

%do dt=&start_date %to &end_date; 
    proc export 
    data=ds (where=(year=&dt.)) outfile="ds&dt..csv" DBMS=CSV replace; 
    run; 
%end; 
%mend date_export; 

%date_export 

Макро

date_export макрокоманда определена между операторами %macro и %mend. Во-первых, диапазон дат определяется как две макропеременные (это можно опустить, а переменные подключаются прямо к оператору %do, но здесь для ясности указано). Оператор %do запускает цикл с переменной макросом dt в диапазоне от start_date и end_date. Это может быть переписано в виде:

%do dt=1991 %to 2011; 

и первых двух %let заявлений опущенных.

Цикл проходит весь код между %do и %end, заменяя значения dt, когда он находит &dt..

Экспорт код

Есть несколько тонких изменений, необходимых для правильного обеспечения proc export пробегов внутри макроса цикла,

  1. Во-первых и наиболее очевидно, я подставил год для &dt., который проходит значение dt в ваш код.

  2. Обратите внимание, что при размещении рядом с .csv требуется дополнительный период (первый период решает с dt, оставляя только один период и csv позади).

  3. Одиночные кавычки из вашего вопроса необходимо заменить двойными кавычками, чтобы макрос разрешился. В противном случае результирующий файл будет называться буквально «ds & dt..csv».

Вы можете включить следующие параметры в SAS, чтобы помочь с макро отладки и визуализации, проверьте документацию SAS для получения дополнительной информации:

SYMBOLGEN 
MLOGIC 
MPRINT 
7

Non-макро вариант:

Вы можете используйте инструкцию file на шаге данных для записи различных типов текстовых или разделительных файлов. С помощью опции filevar вы можете создать один файл для каждого значения переменной, как показано ниже.

Замените yourdata на ваш набор данных и write_location, где вы хотите, чтобы файл был отправлен.

data _null_; 
    set yourdata; 
    length fv $ 200; 
    fv = "\write_location\" || TRIM(put(year,4.)) || ".csv"; 
    file write filevar=fv dsd dlm=',' lrecl=32000 ; 
    put (_all_) (:); 
run; 
+3

Следует также отметить, что для больших наборов данных этот подход намного эффективнее, чем версия макроса, поскольку он должен только один раз считывать набор данных ввода (в отличие от одного раза в год). –

+0

'put _all_;' также работает. – Joe

+1

'put _all_;' приводит к именованному результату (например, «год = 2010») и включает в себя значение fv на выходе, а также другие автоматические переменные '_N_' и' _ERROR_'. Он также не выводит разделители. Способ избежать этого - использовать: 'put (_all_) (:);'. Здесь SAS будет печатать только значения переменных и не будет включать автоматические переменные. Я отредактировал ответ, чтобы отразить это более чистое решение. – DWal

0

Мы не лицензированы процедуры импорта и экспорта, поэтому мы должны использовать другой подход:

%macro xprtDT(dt=,strt=,nd=); 
    %do i=&strt %to &nd; 
     filename myfile "C:\&dt&i..csv"; 
     data _null_; 
     set &dt; 
     file myfile; 
     put 
      @1 var1 z6. 
      @7 ' ' 
      @8 var2 z6. 
      ' ' 
      ... 
      @22 varn; 
     run; 
    %end; 
%mend; 
%xprtDT(datadile,1991,2011); 

Это немного сложнее, но годное к употреблению. Каждая переменная содержит триплет информации после @ - позиция переменной second - это имя переменной, последняя - формат переменной.

Смежные вопросы