2016-06-24 3 views
2

Ich habe eine Tabelle mit 120 Spalten, von denen einige türkische Zeichen enthalten (zB "ç", "ğ", "ı", "ö"). Also möchte ich diese türkischen Zeichen durch englische Zeichen ersetzen (zum Beispiel "c", "g", "i", "o"). Wenn ich "TRANWRD-Funktion" verwende, könnte es wirklich schwer sein, weil ich die Funktion 120 Mal schreiben sollte und manchmal die Spaltennamen ändern könnten, also muss ich den Code immer einzeln überprüfen.Ersetzen von türkischen Zeichen durch englische Zeichen

Gibt es ein einfaches Makro, das diese Zeichen in allen Spalten ersetzt.

+0

Wie viele Zeilen in Ihrer Tabelle? –

+0

fast 100K aber manchmal könnte es mehr als eine Million Zeilen sein –

Antwort

3

Eine Kombination von regulären Ausdrücken und eine DO-Schleife kann das erreichen.

Schritt 1: in der folgenden Art und Weise eine Umwandlungstabelle

Akzentuiert Buchstaben bauen, die mit demselben Ersetzungszeichen lösen sind auf einer einzigen Zeile setzen, durch die getrennt | Symbol.

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

Schritt 2: Shop Original-und Ersatz-Strings in Makrovariablen

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

Schritt 3: Führen Sie die eigentliche Umwandlung

Nur um zu zeigen, wie es funktioniert, lassen sie mit nur einer Spalte umgehen.

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 Resultierende: "c gl oo e, e"

alle Zeichenspalten zu verarbeiten, verwenden wir ein Array

Sagen Sie Ihre Tabelle mySource benannt ist und Sie alle Zeichen zu verarbeitende Variablen; Wir werden dafür einen Vektor namens cols erstellen.

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

es funktioniert, danke ... –

2

Zuerst erhalten Sie alle Ihre Spalten aus dem Wörterbuch, und ersetzen Sie dann die Werte von allen von ihnen in einer Makro-Schleife.

Sie können ein Programm wie dieses versuchen (Ersetzen MYTABLE mit Ihrem Tabellennamen):

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

Ich habe noch nicht versucht, aber ich werde. Ich gebe ein Feedback –

2

Wenn einzelne Zeichen ist die richtige Funktion UEBER ändert, wird es eine Zeile Code sein.

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