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

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

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

Ответы

Ответ 1

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

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

Ответ 3

Ответы здесь касались многих способов создания CSV, но не обязательно эффективности этих методов. Я создаю образец набора данных (temp) с 100 000 строк и пятью столбцами, чтобы протестировать и сравнить методы экспорта набора данных 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), или это займет гораздо больше времени.


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

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

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

Ответ 4

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

В следующем примере, просто Name (varnum = 1) и Height (varnum = 4) извлекаются из SASHELP.CLASS, поскольку 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 или явно перечислять переменные, если их немного. Это просто показывает, что можно сделать.