• ベストアンサー

COBOLで検索する方法

03 REC-DA PIC X(200) 03 CHR1 PIC X(30) という定義があるとき REC-DA = "あいうえおABC12345かきくけこさしすefg" というデータに対して CHR1 = "ABC" または "かきくけ" などがあるかどうかなどの検索をしたい場合 どのような命令で調べるのでしょうか? まずCHR1の長さ3または8?4?をはかりREC-DAもこの長さに区切り順に検索していく・・・ とかいわれましたが、そんな無駄な作業が必要なんですか? いままでC++,JAVAとかやっていたので REC-DA.find(CHR1) = TRUE とかそんな具合にできると思ったのですが。 良い方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.6

#4,#5です。 INSPECTでは部分文字列参照が使えないかと思っていましたが、使えるようですね。len-chr1 と COUNT を数値型として、 move 0 len-chr1 inspect chr1 tallying len-chr1 for characters before " " move 0 to COUNT inspect REC-DA tallying COUNT for all chr1(1:len-chr1) if COUNT = 0 then display "nakatta" else display "atta" end-if

その他の回答 (5)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

#4です。EXAMINEはINSPECTが出来る前の古い命令です。 >うまい方法ないでしょうか? そもそも、そのプログラムにおいてそういった可変長文字列のハンドリングが本当に必要か見直すことも考えられます(COBOLが得意な別の手段で解決できないか?)。可変長文字列の概念の無い言語なんですから。(オブジェクト指向の概念のない言語でオブジェクト指向プログラミングするよりはましかな) とはいえ、現実には難しいでしょうから、面倒だけど部分文字列参照で正攻法で書くか、Cで書いてそれをCALLで呼ぶのが現実的な解でしょう。

Mi8
質問者

お礼

固定長レコードを読み込みそこからユーザーが入力するものを含む レコードを取り出したいのです。 東京都・・・・ などの固定長から例えば'5-1'を含むものとかです。 SQLが使えれば一瞬なんですが、なんとSQLすらないので とても不便に思っています。 20バイト "ABC123DEF456GHI789 " から 5バイト "123 "だと引っかからないようです。 TRIMして検索ができればいいのですが。 とっても不便に感じます。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

move 0 to COUNT inspect REC-DA tallying COUNT for all "ABC" if COUNT = 0 then display "nakatta" else display "atta" end-if で"ABC"の有無を検索できますが、chr1は固定長文字列なので、 move "ABC" to chr1 して chr1 を検索すると、"ABC" の後ろに27個の空白が続いた文字列を探すことになるので、これは目的の動作とは違うでしょう。 COBOLによっては、可変長文字列を扱えるよう拡張されたものもあるかもしれません。 なお、chr1 の文字列の長さを調べるのにinspectが使えます。 move 0 len-chr1 inspect chr1 tallying len-chr1 for characters before " ". COBOLの文字列処理は、INSPECT,STRING,UNSTRINGの機能がうまくはまれば簡潔に書けますが、そうでないと標準関数が貧弱なので苦しいですね。

Mi8
質問者

お礼

固定長ならできたようですが、可変長だとうまくいきませんね。 trimして検索とかできればいいのですが。 うまい方法ないでしょうか?

回答No.3

>どのような命令で調べるのでしょうか? EXAMINEという命令をマニュアルで調べてください。 あまり使いやすい命令ではないので、自分で探査ロジックを書いても 良いとは思いますが..

Mi8
質問者

お礼

googleで調べるとソースコード内検索とかでてきましたがどのように使えばいいのでしょうか?

  • sam_inoue
  • ベストアンサー率47% (27/57)
回答No.2

もう10年位COBOLからは離れているので記憶が薄いですが、 コンパイラによって「部分参照」ができるものがあり、 それなら文字列の一部の参照は可能です。 ただ、FIND...というわけにはいかないので、 自分で開始位置を変えながらループさせて探すことになります。 「部分参照」ができないコンパイラの場合は、 03 REC-DA 05 REC-DA-C PIC X(1) OCCURS 200 として文字列は集団名にセットして、 これを1バイト単位の配列で取り出して、 1文字ずつ判定することになるでしょう。

Mi8
質問者

お礼

これだと相当時間かかりません? ABC abc AbC などを同様に扱う場合や 123 123 もいっしょに扱うとかそう言うのは標準関数で 常識的に使える物だと思いました。

noname#86752
noname#86752
回答No.1

もしあなたの職場でそういうことをしてくれるライブラリを使っていなければ、そういう無駄な作業が必要です。 アルゴリズムの勉強だと思ってやるしかないですね。

Mi8
質問者

お礼

アルゴリズムの勉強ですか。 なんか今更・・・ってショックです。 こんなにもCOBOLというのが使えない言語とは思いませんでした。 Cも結構使いづらいですけどね。

関連するQ&A