2016-06-24 30 views
2

我有一張有120列的表格,其中一些包含土耳其字符(例如「ç」,「ğ」,「ı」,「ö」)。所以我想用英文字符(例如「c」,「g」,「i」,「o」)替換這個土耳其字符。當我使用「TRANWRD函數」時,它可能非常困難,因爲我應該寫120次函數,有時候列名可能會改變,所以我必須一個一個地檢查代碼。用英文字符代替土耳其文字符

是否有一個簡單的宏,它會替換所有列中的這些字符。

+0

您的 表中有多少行? –

+0

差不多100K,但有時可能超過一百萬行 –

回答

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; 
+0

它的工作原理,謝謝... –

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; 
+0

我還沒有試過,但我會。我要給予反饋 –

2

更改單個字符時TRANSLATE是正確的功能,它將是一行代碼。

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