Эффективно преобразовать набор данных SAS в CSV

Может кто-нибудь сказать мне, что является самым быстрым способом программного преобразования набора данных SAS в файл CSV. Я знаю, что могу использовать шаг данных и вывод в файл и т. Д. Но так ли это?

Спасибо, Аднан.

3 ответа

Решение

Что -то в этом роде?

proc export data=sashelp.class
    outfile='c:\temp\sashelp class.csv'
    dbms=csv
    replace;
run;

5 различных способов создать файл.CSV из набора данных SAS.

см. http://studysas.blogspot.com/2009/02/how-to-create-comma-separated-file-csv.html

Ответы здесь касались многих способов создания CSV, но не обязательно эффективности этих методов. Я создаю образец набора данных (temp) с 100000 строк и пятью столбцами для проверки и сравнения методов экспорта набора данных sas в csv с именем temp.csv,


Первый метод: процедура экспорта. Время выполнения: 0,43 секунды.

PROC EXPORT data=temp 
     outfile="temp.csv" dbms=csv replace;

Быстрое время выполнения и простая гибкость при выборе других опций. С учетом сказанного, это не самый сильный для настройки


Второй метод: ОРВ с процедурой печати. Время выполнения: 14,09 секунды.

ODS csv file="temp.csv";
PROC PRINT data=temp noobs;
RUN;
ods csv close;

Этот метод является худшим вариантом из трех для большинства случаев использования, хотя есть несколько особых случаев использования. Это удобно для временного вывода ранее написанных процедур, особенно если вы хотите, чтобы вывод оставался в файле lst (если он не слишком большой). Это также может быть полезно, если вы хотите преобразовать другую процедуру (например, сложную tabulate) подать без дальнейших манипуляций. Если вам не нужна распечатка в файле lst, закройте список (ods listing close) или это займет гораздо больше времени.


Третий метод: Файловая выписка. Время выполнения: 0,06 секунды.

DATA _null_;
    FILE "temp.csv ";
    SET temp;
    put (_all_) (',');
RUN;

Хотя производительность этого метода не плохая, он не интуитивен и выглядит сбивающим с толку. Однако, как упоминалось выше, у вас будет больше контроля над выводом, и он будет иметь самое быстрое время выполнения из всех.

модифицированный data _NULL_ подход

Вот модификация к data _NULL_ подход, который записывает строки заголовка в файл в первом шаге данных, а затем продолжает записывать тот же файл со строками данных во втором шаге данных.

%macro outputCSV(dataset,file);
data _NULL_;
   file "&file." dlm=',' dsd;
   length header $ 2000;
   dsid=open("&dataset.","i");
   num=attrn(dsid,"nvars");
   do i=1 to num;
      header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
      put header @;
   end;
   rc=close(dsid);
run;

data _NULL_;
   set &dataset.;
   file "&file." mod dlm=',' dsd;
   put (_all_) (+0);
run;
%mend;

%outputCSV(sashelp.class,~/temp4.csv)

Можно заставить работать с keep а также drop параметры набора данных (что удивительно), хотя, к сожалению, когда набор данных "открывается" с помощью open(), nvars атрибут учитывает новое количество переменных после keep или же drop, но varlabel а также varname функции все еще ищут переменные, используя их varnum,

В следующем примере просто Name (varnum=1) и Height (varnum=4) извлекаются из SASHELP.CLASSпотому что только две переменные хранятся, nvars равен 2, но если мы переберем цикл с num в качестве верхней границы, мы пропустим Height, потому что это varnum это 4:

 62         data _NULL_;
 63           dsid = open("sashelp.class (keep=name height)","i");
 64           num = attrn(dsid,"nvars");
 65           do i=1 to 5;
 66             vname = varname(dsid,i);
 67             put i= vname= num=;
 68           end;
 69         run;

 i=1 vname=Name num=2
 NOTE: Argument 2 to function VARNAME(1,2) at line 66 column 13 is invalid.
 i=2 vname=  num=2
 NOTE: Argument 2 to function VARNAME(1,3) at line 66 column 13 is invalid.
 i=3 vname=  num=2
 i=4 vname=Height num=2
 NOTE: Argument 2 to function VARNAME(1,5) at line 66 column 13 is invalid.
 i=5 vname=  num=2
 dsid=1 num=2 i=6 vname=  _ERROR_=1 _N_=1

Есть два варианта:

  • Извлеките истину nvars значение путем удаления параметров набора данных для первого прохода
  • Используйте действительно большое число вместо numхотя это только приводит к большому количеству 'invalid' заметки в журнале

Это первый подход, требующий двух вызовов open функция:

%macro outputCSV(dataset,file);
data _NULL_;
   file "&file." dlm=',' dsd;
   length header $ 2000;
   dsid=open("%SCAN(&dataset.,1,()","i");
   num=attrn(dsid,"nvars");
   rc=close(dsid);
   dsid=open("&dataset.","i");
   do i=1 to num;
      header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
      if _error_ = 0 then put header @;
      _error_ = 0;
   end;
   rc=close(dsid);
run;

data _NULL_;
   set &dataset.;
   file "&file." mod dlm=',' dsd;
   put (_all_) (+0);
run;
%mend;

%outputCSV(sashelp.class (keep=name height),~/temp4.csv)

После записи всего этого, вероятно, имеет смысл пойти с PROC EXPORT в большинстве случаев, или явно перечислите переменные, если их не много. Это просто показывает, что можно сделать.

Другие вопросы по тегам