Macros 将土耳其语字符替换为英语字符

Macros 将土耳其语字符替换为英语字符,macros,sas,enterprise-guide,Macros,Sas,Enterprise Guide,我有一个表,有120列,其中一些包括土耳其语字符(例如“ç”、“ğ”、“ı”、“ö”)。因此,我想用英语字符(例如“c”、“g”、“i”、“o”)替换这个土耳其语字符。当我使用“TRANWRD函数”时,这可能会非常困难,因为我应该编写120次函数,有时列名可能会更改,因此我必须逐个检查代码 是否有一个简单的宏来替换所有列中的这些字符。首先从字典中获取所有列,然后在宏do循环中替换所有列的值 您可以尝试这样的程序(用表名替换MYTABLE): 编辑 回想起来,这是一个过于复杂的解决方案。。。另一个

我有一个表,有120列,其中一些包括土耳其语字符(例如“ç”、“ğ”、“ı”、“ö”)。因此,我想用英语字符(例如“c”、“g”、“i”、“o”)替换这个土耳其语字符。当我使用“TRANWRD函数”时,这可能会非常困难,因为我应该编写120次函数,有时列名可能会更改,因此我必须逐个检查代码


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

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

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

编辑

回想起来,这是一个过于复杂的解决方案。。。另一个用户指出,应使用
translate()
函数。重复使用时,可将其集成到使用
PROC FCMP
定义的SAS功能中


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

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

解析为相同替换字符的重音字母放在一行上,用|符号分隔

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

proc sql noprint;
  select orig, repl, count(*)
    into :orig separated by ";",
         :repl separated by ";",
         :nrepl
    from conversions;
quit;
步骤3:进行实际转换

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

结果
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;

当改变单个字符的翻译是正确的功能时,它将是一行代码

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

你的桌子上有多少行?将近10万行,但有时可能超过100万行。我还没试过,但我会的。我会给你一个反馈
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;
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;
translated = translate(string,"cgio","çğıö");