以下にサンプル作成から変換までフルコード載せています。(OBS数は200に制限しています)
これをこのまま実行して、想定通りか確認してみてください。
その後、ご自身のデータをsetして動くか確認してください。
/* サンプルデータ作成 */
data sample2(keep=original);
array zen{36} $2 ('a','b','c','d','e','f','g','h','i','j'
,'k','l','m','n','o','p','q','r','s','t'
,'u','v','w','x','y','z'
,'1','2','3','4','5','6','7','8','9','0'
);
length original $4000 /* 4000バイト */
rand0 8 /* 数値、アルファベットの処理フラグ */
rand1 8 /* 連続させる文字数 */
rand2 $2; /* ランダムな英数字 */
seed=int(datetime());
do i=1 to 20000;
original='';
do until(length(original)>3999);
rand0=mod(int(100*ranuni(seed)+1),4);
rand1=int(10*ranuni(seed)+0);
select (rand0);
when(0) rand2=zen {int(35*ranuni(seed)+ 1)};
when(1) rand2=byte(int( 9*ranuni(seed)+48));
when(2) rand2=byte(int(25*ranuni(seed)+65));
when(3) rand2=byte(int(25*ranuni(seed)+97));
otherwise;
end;
original=cats(original,repeat(strip(rand2),rand1));
end;
output;
end;
run;
/* 半角(数字3桁以上)から全角に変換 */
data H2Z_converted(keep=original modified);
set sample2(obs=100);
length modified $8000;
modified = original;
/* 正規表現識別子 */
prxid=PRXPARSE('/[0-9]{3,}/');
idx = PRXMATCH(prxid, trim(modified));
do while(idx>0);
before = PRXPOSN(prxid, 0, modified);
after = KPROPCASE(before,'HALF-ALPHABET, FULL-ALPHABET');
modified= subpad(modified,1,index(modified,strip(before))-1)||trim(after)||substr(modified,index(modified,strip(before))+length(before));
idx = PRXMATCH(prxid, trim(modified));
end;
run;
/* 全角(数字3桁以上)から半角に変換 */
data Z2H_converted(keep=original modified);
set sample2(obs=100);
length modified $4000
temp $4000 /* 全角文字列 */
char $2; /* 処理対象文字 */
idx=kindexc(original,'0123456789');
cnt=0;
temp='';
if idx=0 then do;
modified=original;
end; else
do;
if idx=1 then do;
modified='';
end; else
if idx>1 then do;
modified=ksubstr(original,1,idx-1);
end;
do i=idx to klength(original);
/* 全角数値ならキープ */
char=ksubstr(original,i,1);
if char in ('0','1','2','3','4','5','6','7','8','9') then do;
cnt=cnt+1;
temp=cats(temp,char);
/* 最後だけ全角数値でも処理を行う */
if i=klength(original) then do;
if cnt>=3 then do;
modified=cats(modified,KPROPCASE(temp,'FULL-ALPHABET, HALF-ALPHABET'),char);
end; else
do;
modified=cats(modified,char);
end;
end;
end; else
/* 全角数値でない、3連続以上全角数値だったら置換 */
if cnt>=3 then do;
modified=cats(modified,KPROPCASE(temp,'FULL-ALPHABET, HALF-ALPHABET'),char);
cnt=0;
temp='';
end; else
/* 全角数値でない、3連続未満全角数値だったらそのまま */
if 0<cnt<3 then do;
modified=cats(modified,temp,char);
cnt=0;
temp='';
end; else
/* 全角数値でない、直前が全角数値以外だったらそのまま */
do;
modified=cats(modified,char);
end;
end;
end;
run;
... View more