我有一張有120列的表格,其中一些包含土耳其字符(例如「ç」,「ğ」,「ı」,「ö」)。所以我想用英文字符(例如「c」,「g」,「i」,「o」)替換這個土耳其字符。當我使用「TRANWRD函數」時,它可能非常困難,因爲我應該寫120次函數,有時候列名可能會改變,所以我必須一個一個地檢查代碼。用英文字符代替土耳其文字符
是否有一個簡單的宏,它會替換所有列中的這些字符。
我有一張有120列的表格,其中一些包含土耳其字符(例如「ç」,「ğ」,「ı」,「ö」)。所以我想用英文字符(例如「c」,「g」,「i」,「o」)替換這個土耳其字符。當我使用「TRANWRD函數」時,它可能非常困難,因爲我應該寫120次函數,有時候列名可能會改變,所以我必須一個一個地檢查代碼。用英文字符代替土耳其文字符
是否有一個簡單的宏,它會替換所有列中的這些字符。
正則表達式和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;
它的工作原理,謝謝... –
首先從字典中獲取所有列,然後在宏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;
我還沒有試過,但我會。我要給予反饋 –
更改單個字符時TRANSLATE是正確的功能,它將是一行代碼。
translated = translate(string,"cgio","çğıö");
您的 表中有多少行? –
差不多100K,但有時可能超過一百萬行 –