2016-06-24 5 views
2

나는 120 개의 열을 가지고 있고 그 중 일부는 터키 문자 (예 : "ç", "ğ", "ı", "ö")를 포함하는 테이블을 가지고 있습니다. 그래서이 터키 문자를 영어 문자 (예 : "c", "g", "i", "o")로 대체하려고합니다. "TRANWRD Function"을 사용할 때 120 번 함수를 작성해야하고 때로는 열 이름이 변경 될 수 있으므로 항상 힘들 수 있습니다. 따라서 항상 코드를 하나씩 확인해야합니다.터키어 문자를 영어 문자로 바꾸기

모든 열에서이 문자를 대체하는 간단한 매크로가 있습니까?

+0

테이블에 몇 행이 있습니까? –

+0

거의 100K이지만 때로는 백만 줄 이상이 될 수도 있습니다. –

답변

3

조합 :

는이 같은 프로그램 (테이블 이름으로 MYTABLE 교체)을 시도 할 수 있습니다.

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 단계에 보관 원본과 교체 문자열 : 수행 실제 변환

그냥 어떻게 작동하는지,하자 보여 하나의 열만 처리하십시오. 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; 

:

모든 문자 열을 처리하기 위해 "C GL OO 전자, 전자,"우리는

이 테이블 mySource이라는 말 배열을 사용하고 모든 문자를 원하는 처리 될 변수; 이를 위해 cols이라는 벡터를 만듭니다.

+0

피드백을 드리겠습니다, 고마워요 ... –

2

먼저 사전에서 모든 열을 가져온 다음 매크로 do 루프의 모든 값을 바꿉니다. 정규 표현식과 DO 루프가 달성 할 수의

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","çğıö"); 
관련 문제