AS400/IBMi REPLACEとSCANで置換と文字の除去

IT関連

自分の備忘録です。間違えがあればご容赦ください。

 

某条件下の場合、READで読んだ某ファイルの某カラムにある、某文字を消去したいという要望がありました。

某が多すぎて申し訳ありませんが、例えば商品名で「AGCコーヒー」というのがあったとすると、「AGC」を削除して単に「コーヒー」と表示したい。要するにreplaceをするということです。

PHPだとstr_replaceを使って

// str_replace(置換前,置換後,対象);

$string = 'AGCコーヒー';
echo str_replace('AGC','',$string); //コーヒー
echo str_replace('AGC','UCC',$string); //UCCコーヒー

こうすれば済むのですが、IBMiの%REPLACEを見るとなんかややこしい。

 

IBMiの%REPLACE関数は私なりの解釈だと、

%REPLACE(置換後 : 対象 : 位置 : 文字数);

らしいです。意味がわからん。

 

今回のお題はAGCを消すなので、とりあえず下準備。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';
DSPLY STRING; //AGCコーヒー

 

%REPLACEの置換後と対象は決まっているので、ここまでは入る。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';
DSPLY %REPLACE('' : STRING : 位置 : 文字数);

 

位置や文字数とは、SUBSTRと同じで開始位置と文字数を指定するみたい。

 

AGCの場合だと3文字なので、文字数は素直に3でOK。

あとは位置。これは%SCANを使うみたい。

 

%SCAN関数の公式はこう。

%SCAN(検索文字列 : 対象);

戻り値は対象の中に検索文字列があった位置なので、1とか2の数字が返ってくる。

 

%SCANで取り出してみる。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';
DSPLY %SCAN('AGC':STRING);    //1

ちゃんと見つかった最初の位置を返してくれています。

よくある0スタートではなく1スタートのようです。

 

ちなみに%SCANを色々試してみるとこうなりました。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';

DSPLY %SCAN('A':STRING);      //1
DSPLY %SCAN('C':STRING);      //3
DSPLY %SCAN('コーヒー':STRING); //4
DSPLY %SCAN('コ':STRING); //0

なぜか’コ’がうまく行かなかったです。基本的に全角文字は出来ないと思った方が良さそう。

 

ようやく本題です。%REPLACEに入れてみます。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';
DSPLY %REPLACE('' : STRING : %SCAN('AGC':STRING) : 3); // コーヒー

一応成功しましたが、しかしコーヒーの前に微妙なブランクが空いてしまいます。

 

なので%TRIMを使ってあげます。これが最終形です。

DCL-S STRING CHAR(50);
STRING = 'AGCコーヒー';
DSPLY %TRIM(%REPLACE('' : STRING : %SCAN('AGC':STRING) : 3)); //コーヒー

 

ただ、除去したい文字列が文字列の中央にあった場合は%TRIMでは除去できません。その場合はどうすればいいかは今回のお題ではないので、割愛させていただきます。

以上です。

コメント

タイトルとURLをコピーしました