Ответ 1
что-то в этом роде?
proc export data=sashelp.class
outfile='c:\temp\sashelp class.csv'
dbms=csv
replace;
run;
Может ли кто-нибудь сказать мне, что является самым быстрым способом программного преобразования данных SAS в файл CSV. Я знаю, что могу использовать шаг данных и выводить его в файл и т.д. Но это единственный способ?
Спасибо, Аднан.
что-то в этом роде?
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
) с 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;
Хотя производительность этого метода не плохая, он не интуитивен и выглядит запутанным. Однако, как упоминалось выше, у вас будет больше контроля над выводом, и он будет иметь самое быстрое время выполнения из всех.
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
или явно перечислять переменные, если их немного. Это просто показывает, что можно сделать.