我有一个 SAS 数据集,必须导出到 .csv 文件。我有以下两个相互矛盾的要求。
我必须使用分号作为 .csv 文件中的分隔符。
一些字符变量是从公式中手动输入的字符串,因此它们可能包含分号。
我对上述问题的解决方案是转义分号或用逗号替换它。
tranwrd
在整个数据集上使用?我的尝试:
对于每个变量,tranwrd(.., ";", ",")
对数据集中的变量使用该函数。更新数据集并循环所有变量。然而,对于半大型数据集来说,这自然是一种非常低效的方法,因为我必须为每个变量执行一个数据步骤。它的代码相当难看,因为我必须通过几个步骤才能获取变量名称,但效率低下确实是最糟糕的。
data test;
input w $ c b d e $ f $;
datalines4;
Aaa;; 50 11 1 222 a;s
Bbb 35 12 2 250 qw
Comma, 75 13 3 foo zx
;;;;
run;
* Get the variable names;
proc contents data=test out=vars(keep=name type varnum) order=varnum noprint;
run;
* Sort by variable number;
proc sort data=vars;
by varnum;
run;
* Put variable names into a space-separated string;
proc sql noprint;
select compress(name)
into :name_list separated by ' '
from vars;
quit;
%let len = %sysfunc(countw(&name_list));
*Initialize loop dataset;
data a;
set test;
run;
%macro loop;
%do i = 1 %to &len;
%let j = %scan(&name_list,&i);
data a(rename=(v_&j = &j) drop=&j);
set a;
v_&j.=compress(tranwrd(&j,";",","));
run;
%end;
%mend;
%loop;
Run Code Online (Sandbox Code Playgroud)
我想我可能对你的问题有更优雅的解决方案:
data class;
set sashelp.class;
array vars [*] _character_;
do i = 1 to dim(vars);
vars[i] = compress(tranwrd(vars[i],"a","X"));
end;
drop i;
run;
Run Code Online (Sandbox Code Playgroud)
您可以用来array
引用数据集中的所有字符列,然后循环遍历它们。