自分の備忘録です。間違えがあればご容赦ください。
某条件下の場合、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では除去できません。その場合はどうすればいいかは今回のお題ではないので、割愛させていただきます。
以上です。
コメント