用英文字符替换土耳其字符

时间:2016-06-24 08:18:08

标签: macros sas enterprise-guide

我有一个包含120列的表,其中一些包含土耳其语字符(例如“ç”,“ğ”,“ı”,“ö”)。所以我想用英文字符替换这个土耳其字符(例如“c”,“g”,“i”,“o”)。当我使用“TRANWRD函数”时,它可能真的很难,因为我应该写函数120次,有时候列名可能会改变,所以我总是要逐一检查代码。

是否有一个简单的宏替换所有列中的这些字符。

3 个答案:

答案 0 :(得分:3)

正则表达式和DO循环的组合可以实现这一点。

第1步:按以下方式构建转换表

解析为相同替换字符的强调字母放在一行上,由|分隔符号

data conversions;
  infile datalines dsd;
  input orig $ repl $;
  datalines;
ç,c
ğ,g
ı,l
ö|ò|ó,o
ë|è,e
;

第2步:将原始和替换字符串存储在宏变量中

proc sql noprint;
  select orig, repl, count(*)
    into :orig separated by ";",
         :repl separated by ";",
         :nrepl
    from conversions;
quit;

第3步:进行实际转化

为了说明它是如何运作的,让我们只处理一个专栏。

data convert(drop=i re);
  myString = "ç ğı òö ë, è";
  do i = 1 to &nrepl;
    re = prxparse("s/" || scan("&orig",i,";") || "/" || scan("&repl",i,";") || "/");
    myString = prxchange(re,-1,myString);
  end;
run;

结果myString:" c gl oo e,e"

要处理所有字符列,我们使用数组

假设您的表名为mySource,并且您希望处理所有字符变量;我们将为此创建一个名为cols的向量。

data convert(drop=i re);
  set mySource;
  array cols(*) _character_;
  do c = 1 to dim(cols);
    do i = 1 to &nrepl;
      re = prxparse("s/" || scan("&orig",i,";") || "/" || scan("&repl",i,";") || "/");
      cols(c) = prxchange(re,-1,cols(c));
    end;
  end;
run;

答案 1 :(得分:2)

首先从字典中获取所有列,然后在宏do循环中替换所有列的值。

您可以尝试这样的程序(用您的表名替换MYTABLE):

proc sql; 
select name , count(*) into :columns separated by ' ', :count
from dictionary.columns 
where memname = 'MYTABLE'; 
quit; 

%macro m;
data mytable;
set mytable;
%do i=1 %to &count;
%scan(&columns ,&i) = tranwrd(%scan(&columns ,&i),"ç","c");
%scan(&columns ,&i) = tranwrd(%scan(&columns ,&i),"ğ","g");
...
%end;

%mend;

%m;

答案 2 :(得分:2)

当更改单个字符时,TRANSLATE是正确的功能,它将是一行代码。

translated = translate(string,"cgio","çğıö");