2016-06-24 19 views
2

私は120列のテーブルを持ち、その中にはトルコ文字(たとえば "ç"、 "ğ"、 "ı"、 "ö")を含むテーブルがあります。だから私は英語の文字(例えば "c"、 "g"、 "i"、 "o")でこのトルコ語の文字を置き換えたいです。私は "TRANWRD Function"を使うと、関数を120回書く必要があり、時にはカラム名が変わることがあるので、実際には難しいかもしれません。そのため、常にコードをチェックする必要があります。トルコ語の文字を英字に置き換える

すべての列でこの文字を置き換える単純なマクロはありますか?

+0

テーブルの行数はいくつですか? –

+0

ほぼ100Kですが、時には100万行以上になる可能性があります –

答えて

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:、ちょうどそれがどのように動作するかを示すために実際の変換

をやらせるの1つの列だけを処理します。 "C GL OO E、E" すべての文字列を処理するために

、我々は

があなたのテーブルがmySourceという名前で言うと、あなたはすべての文字をたいアレイを使用する:myString結果として得られる

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; 

処理される変数。そのためにcolsというベクトルを作成します。

+0

それは、ありがとう、働く... –

2

まず、すべての列を辞書から取得し、マクロのすべての値を置き換えます。

あなたは(あなたのテーブル名で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; 
+0

まだ試していませんが、私は行います。私はフィードバックを与えるつもりです –

2

単一文字を変更するときは、TRANSLATEが適切な機能であり、1行のコードになります。

translated = translate(string,"cgio","çğıö"); 
関連する問題