SAS 替换所有列中的字符

The*_*kel 2 sas

我有一个 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)

fl0*_*r3k 7

我想我可能对你的问题有更优雅的解决方案:

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引用数据集中的所有字符列,然后循环遍历它们。

  • @fl0r3k 当您只更改单个字符时, TRANSLATE 将是首选功能。 (3认同)