• 締切済み

COBOLの文字列検索を教えて下さい。

cobol初心者です。 「100バイトのレコードを複数件読み込み、決まった文字列を検索する」というPGMを作ろうとしています。 03 REC-1 PIC X(100) 03 REC-2 PIC X(05) という定義があるとき REC-1 = "abcdefghijklmnopqrstu…"       というデータに対して、 REC2 = "hijkl"                    の検索をしたい場合 どのようなコーディングで調べることができるのでしょうか? 何レコード目の何バイトでヒットしたかを表示したいので、 INSPECT命令は使用せず、REC-1を1バイト単位で取り出して、 1文字ずつ判定しようと思っています。 レコードを越えてのヒットは行いません。 この場合配列を使うという考え方は正しいですか? 読み込んだ100バイトのレコードを1バイト単位で取り出して比較するには、 REDEFINEを用いて再定義すると考えています。 その場合のREADでの読み込み方がよくわかりません。 コーディング例等を載せてもらえると助かります。 cobolをはじめたばかりで、基本的な知識が抜けているかもしれません・・・ よろしくお願い致します。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

unstring が使えそうな気がしたので、やってみました。 unstring は、ある意味で、ポインタを進めながら文字列を探す機能なので、それを使います。 ptr が、「ここまで探した。次はここから探す」というインデクスです。 プログラム中の10はデータ長、2は探す文字列長です。 identification division. program-id. samp1. data division. working-storage section. 01 data1 pic x(10) value "1234123423". 01 key1 pic x(02) value "23". 01 dmy pic x(10). 01 ptr pic 9999 comp value 1. 01 pre pic 9999 comp. 01 cnt pic 9999 comp. 01 wk pic 9999 comp. procedure division. perform until ptr greater 10 compute pre = ptr unstring data1 delimited by key1 into dmy count cnt pointer ptr end-unstring if ptr not = pre+cnt compute wk = ptr - 2 display "Found at ", wk end-if end-perform stop run. あまりわかりやすくないですね。NO1の方のように部分文字列を使う方が直感的。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

文字列中にある文字列がどこにあるかを検索するアルゴリズムには「ボイヤー・ムーア法」という有名な方法があります。 http://itpro.nikkeibp.co.jp/article/MAG/20061115/253802/ が、そんなに凝らないで単純比較でやるなら IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 01 DISP-M. 03 FILLER PIC X(4) VALUE "JKL=". 03 I PIC 9(2). 77 REC-1 PIC X(26) VALUE "ABCDEFGHIJKLMNOPQRSTUVWXYZ". 77 REC-2 PIC X(3) VALUE "JKL". 77 END-F PIC X(3) VALUE "OFF". PROCEDURE DIVISION. PERFORM VARYING I FROM 1 BY 1 UNTIL I >= 24 IF REC-1(I:3) = REC-2 THEN DISPLAY DISP-M EXIT PERFORM END-IF END-PERFORM. STOP RUN. こんな感じかな。 後は、ファイル入力して回していくということで。

関連するQ&A

  • 富士通COBOLの画面定義について

    何年か前にはNECでプログラムを組んでいたのですが、最近は富士通のCOBOLでプログラムを組んでいます。富士通のCOBOLで画面の定義がよく わかりません。例えば下記の記述で FD DSP-F. 01 GM-REC. 03 GRP001. 05 GM-SYORI-K-COM PIC X(03). 05 GM-SYORI-K PIC 9(01). 上記のGM-SYORI-K-COM PIC X(03)の3バイトは何を定義しているのですか?それとこの3バイトを使ってどんな事ができるのですか? 富士通のマニュアルを見ても説明しているところがなくて困っています。 基本的な質問で申し訳ありませんが、よろしくお願いします

  • 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 とかそんな具合にできると思ったのですが。 良い方法を教えてください。

  • COBOLで変数が何文字で宣言されたかを取得する方法

    COBOLで、例えば 01 IN-REC. 02 IN-BANGO PIC X(05). 02 IN-SHIMEI PIC X(15). …(100個続く)… 02 IN-CLASS PIC X(10). 02 IN-SEISEKI. 03 IN-SUGAKU PIC 9(03). 03 IN-EIGO PIC 9(03). …(続く)… 03 IN-KOKUGO PIC 9(03). となっていたとします。このとき、プログラム中で IN-RECが何文字で宣言されているかを上の宣言文の各変数の文字数を いちいち計算機か暗算で足し算していく以外に関数みたいな形で 知る方法はないでしょうか? また、ないなら、それを計算するマクロを自力で作るにはどうしたら よいのでしょうか?

  • COBOLでの可変長定義について

    unix環境下でCOBOL85を使用しています。 あるデータを可変長でWRITEしていくのですが、 データにヘッダー情報みたいなものが付加されてしまい困っています。 ヘッダー情報を付加しないようにするにはどうすればいいのでしょうか? 定義:  FD Aファイル RECORD IS VARYING 1 TO 100 DEPENDING ON A-CNT.  01 A-DATA PIC X(100). とか  FD Aファイル RECORD IS VARYING IN SIZE DEPENDING ON A-CNT.  01 A-DATA PIC X(100). というパターンで試しています。 Aファイルにaaaという3バイトデータをWRITEすると、 COBOL85020315020304・・・・・aaaというデータが出力されます。 あるコボラーに聞くと「定義がおかしいからでしょう」と言ってたのですが、 どうおかしいかは本人もわからないようです。 どうすればヘッダー情報(COBOL85020315020304・・・・・)がつかず、 可変長でWRITEできるのでしょうか?教えて下さい。

  • COBOL数値転記の仕様

    このたび、まったくの未経験のCOBOLをやることになりました。 で、数値データの表し方になんやかやとやたら方法があるようなのですが、それらを互いに「転記」したときに、どういう結果になるものか、皆目わからないんです(環境はCOBOL85でWindows上での開発です)。 テクニックとしては基本だと思うのですが、それでいてどこにも説明されていな~い!フリーのCOBOLツールは見つけてきましたが、使い方が???なもので…。  たとえば、  01 X1 PIC XX (数値が入ってるとします)  01 N1 PIC 99  01 D1 PIC 99 COMP  01 B1 PIC 1(16) BIT な場合、X1とN1は直接  MOVE N1 TO X1 などとやってもデータは失われないと思うんですが、他の形式での操作は(桁あふれとか無視して)ちゃんと転記できるのでしょうか。 いま特に、D1からX1へというパターンが多いです。1バイトの2進データを、数値の文字列として使おう、というんです。いわば、1バイトを3バイトに展開してやるんです。何も考えずに書けば、  01 D2 PIC 9(4) COMP VALUE 97  01 X2 PIC X(3)  MOVE D2 TO X2 でしょうけど、たぶん'a△△'になるだけのような気がします…。  それとも、  01 N2 PIC 9(4)  MOVE D2 TO N2  MOVE N2 TO X2 などとやっていけたりするのでしょうか。 いったいどうなるのでしょう、いろいろ書いちゃいましたけど、各々の転記の仕組みを教えてください。 また、COBOLの(お堅い規格を書き写しただけでない)解説のサイトなどあれば、ご紹介いただけますでしょうか。

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • COBOL FILLER

    COBOLのFILLER項目の出力を質問させていただきます。 質問1 OUT1-FILE. 01 OUT-REC  02 FILLER PIC X(10). このファイルを何もせず WRITE で出力した場合は空ファイルが出力されますか?それとも"0000000000"が出力されますか? 質問2 またこのファイルをINITHILIZEした後WRITEでファイル出力したら何が出力されますか? 質問3 このファイルをMOVE ZERO TO OUT-REC した後WRITEでファイル出力したら何が出力されますか?

  • COBOLとCの変数定義

    いつもお世話になってます。 今回は、COBOLとC言語の変数定義の事で質問させていただきます。 以下のCOBOLの変数定義をC言語で記述するとどのようになるでしょうか? 01 wkarea. 05 wk-code. pic s9(03) comp. 05 wk-err-code. 10 filler. pic x(01) value '0'. 10 wk-err-code-9 pic 9(05) 412. 05 wk-err-mdl. 10 filler pic x(01) value '0'. 10 wk-err-mdl-9 pic 9(40) value space. 05 wk-e-code 10 filler pic x(01) value 'A'. 10 filler pic x(01) value 'B'. 10 wl-id pic x(02). 10 wk-no pic 9(03) value xero 10 wk-level pic x(01) value low-value. ちょっと手間かも分かりませんが、どなたか詳しい方いらっしゃいましたら、お答え頂けると有難いです。 よろしくお願いします。 .

  • 【COBOL】文字列から数値項目に転記するにあたって

    こんにちは。 早速ですがCOBOLのプログラミングで困っています。 MOVEを使って文字列を数値項目に転記する際についてなのですが、 私の今の困っている現状を報告します。 ↓  ↓   ↓ W-A PIC X(5). ←中身は12345 上記のW-Aをの中味が、文字列で'12345'となっている場合に、 このW-Aの中味を、12.345と数値項目で表示するにはどうすればいいのでしょうか?ちなみに小数点第3位まで表示したいのです。 色々参考書とか見ても分からなかったので困っています。。 今日中に終わらせなくてはならない事なので、どうかアドバイスの方を頂けたらと思っています。。 基本的な部分で申し訳ないのですが、どうぞ宜しくお願いします。

  • COBOLでのランダムアクセス

    すみませんCOBOL初心者です。 FILE-CONTROL. SELECT URIAGE-MOKUHYOU ASSIGN TO "c:\dat\mokuhyou.dat" ORGANIZATION IS INDEXED ACCESS MODE IS RANDOM RECORD KEY IS UM-SHITEN-CODE. DATA DIVISION.   FILE SECTION.   FD URIAGE-MOKUHYOU.   01 UM-REC.    05 UM-SHITEN.     10 UM-SHITEN-CODE PIC X(4).     10 UM-SHITEN-MEI PIC X(20).    05 UM-KINGAKU PIC 9(10) OCCURS 12. WORKING-STORAGE SECTION.   01 TSUKI PIC 9(2).   01 WK-SHITEN-CODE PIC X(4). PROCEDURE DIVISION.   DISPLAY "支店コードを入力してください --> : "   ACCEPT WK-SHITEN-CODE   OPEN INPUT URIAGE-MOKUHYOU   READ URIAGE-MOKUHYOU    INVALID KEY     DISPLAY "ERROR; 支店コード = " WK-SHITEN-CODE    NOT INVALID KEY     DISPLAY WK-SHITEN-CODE " の売上げ目標は " UM-REC   END-READ.   STOP RUN. というプログラムを作成し、"mokuhyou.dat"という入力ファイルに正しくデータが格納されているのですが、コンパイルは問題なく、実行すると、 JMP0310I-U OPEN ERROR FILE=mokuhyou.dat. 'ACC-METHOD'. PGM=TEST046 ADR=00401258 とまず画面にでて、OKを押すと、 JMP0099I-U FORCED TERMINATION CODE=0310 というエラーになります。 おそらくファイルが正常に読み込めないものと推測されますが、解決法を教えてください。お願いします。

専門家に質問してみよう