Sourav :
당신은 내가 strings
값이 states
값에 포함 찾을 수 있습니다 가정합니다 TRANWRD
언급 때문입니다. TRANWRD
의 효과적인 사용의 핵심은 변수가 대상 및 대체 인수에 사용되는 경우 값이 TRIM
인 것입니다.
교체 문제 :
- 포함 된 하나의 목표 값 이있는 경우
TRANWRD
의 단일 사용이 작동합니다.
- 하나 이상의 대상 값이 포함될 수있는 경우 모든 대상에 대한 루프가 필요합니다.
이전 교체로 인해 이전에 분명하지 않은 유효한 교체가 발생할 수있는 가능성이 있습니다. 다음 state
값을 고려 : 모든 대상을 통해 두 번째 루프는 S2
와 ABC_S1
을 대체 할 모든 대상을 통해 첫 번째 루프가
ABC_S1
을 S1
와 ABC_MNO_S3
을 교체하고 얻을 것이다
ABC_ABC_MNO_S3
및 산출
S2
테스트 샘플 :
data have;
infile cards dlm="," dsd;
length states segment year $100;
input states segment year;
datalines;
"TR_ABC_MNO_S3_ABC_S2 TR_ABC_S1_ABC_S2", "ABC_PQR_S3 TR_XYZ_MNO_S3_XYZ_S2", "St_XYZ_S2"
run;
data mappings;
length string $30 new_string $2;
input string new_string;
datalines;
ABC_MNO_S3 S1
ABC_S1 S2
ABC_S2 S3
ABC_PQR_S3 S4
XYZ_MNO_S3 S5
XYZ_S1 S6
XYZ_S2 S7
XYZ_PQR_S3 S8
run;
data want;
array maps(100,2) $50 _temporary_; * first dimension must be larger than number of mappings;
do _i_ = 1 by 1 until (lastmap);
set mappings(rename=(string=_map_from new_string=_map_to)) end=lastmap;
maps(_i_,1) = _map_from;
maps(_i_,2) = _map_to;
end;
length status $12 _result $200;
do until (lastdata);
set have end=lastdata;
array targets states segment year;
status = 'ORIGINAL';
output;
do _i_ = 1 to dim(targets);
_result = targets[_i_];
_guard = 1;
do until (_noreplacement or _guard >= 10);
_noreplacement = 1;
do _j_ = 1 to dim(maps,1) while(maps(_j_,1) ne '');
if index(_result,trim(maps(_j_,1))) then do;
* put _result ': ' maps(_j_,1) '-> ' maps(_j_,2);
_result = tranwrd(_result, trim(maps(_j_,1)), trim(maps(_j_,2)));
_noreplacement = 0;
end;
end;
end;
if (_guard > 10) then do;
put 'WARNING: Guard limit 10 reached, mappings may be cycling.' _result;
end;
targets[_i_] = _result;
end;
status = 'MAPS APPLIED';
output;
end;
stop;
drop _:;
run;
귀하의 질문에 답하는 것은 가능하지만 여기에서 구체적으로 시도한 코드의 예가 포함 된 경우 더 좋을 것입니다. – Joe
시도한 코드를 게시하십시오. – Reeza