Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Based on Bill Woodger's comments, here is a better solution. Thank's Bill, for teaching me not to slouch :) I still like looping through each record as a way to catch multiple matches on one line, so I kept that part. <code></p> <pre><code> IDENTIFICATION DIVISION. PROGRAM-ID. FIND-STRING-2. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-FILE ASSIGN TO 'SAMPLE-LEN.TXT' ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS IN-FILE-STATUS. DATA DIVISION. FILE SECTION. FD IN-FILE. 01 IN-RECORD PIC X(80). WORKING-STORAGE SECTION. 01 IN-FILE-STATUS PIC XX. 01 END-OF-FILE-SWITCH PIC XXX VALUE 'NO '. 88 END-OF-FILE VALUE 'YES'. 01 STRING-MARKER-LEFT PIC X(7) VALUE 'LENGTH('. 01 STRING-MARKER-RIGHT PIC X VALUE ')'. 01 STRING-MARKER-LENGTH PIC 99 USAGE BINARY. 01 STRING-INDEX PIC 99 USAGE BINARY. 01 START-INDEX PIC 99 USAGE BINARY. 01 END-INDEX PIC 99 USAGE BINARY. 01 RECORD-LENGTH PIC 99 USAGE BINARY. 01 SEARCH-LENGTH PIC 99 USAGE BINARY. 01 IS-END-FOUND PIC XXX VALUE 'NO '. 88 END-FOUND VALUE 'YES'. 88 END-NOT-FOUND VALUE 'NO '. PROCEDURE DIVISION. MAIN. OPEN INPUT IN-FILE IF IN-FILE-STATUS NOT = '00' DISPLAY 'FILE READ ERROR ' IN-FILE-STATUS END-DISPLAY PERFORM EXIT-PROGRAM END-IF PERFORM INITIALIZE-LENGTHS PERFORM UNTIL END-OF-FILE READ IN-FILE AT END SET END-OF-FILE TO TRUE NOT AT END PERFORM FIND-STRING END-READ END-PERFORM PERFORM EXIT-PROGRAM . INITIALIZE-LENGTHS. MOVE FUNCTION LENGTH(IN-RECORD) TO RECORD-LENGTH COMPUTE STRING-MARKER-LENGTH = FUNCTION LENGTH( STRING-MARKER-LEFT) END-COMPUTE COMPUTE SEARCH-LENGTH = RECORD-LENGTH - STRING-MARKER-LENGTH END-COMPUTE . FIND-STRING. PERFORM VARYING STRING-INDEX FROM 1 BY 1 UNTIL STRING-INDEX &gt; SEARCH-LENGTH IF IN-RECORD(STRING-INDEX:STRING-MARKER-LENGTH) = STRING-MARKER-LEFT COMPUTE START-INDEX = STRING-INDEX + STRING-MARKER-LENGTH END-COMPUTE SET END-NOT-FOUND TO TRUE PERFORM VARYING END-INDEX FROM START-INDEX BY 1 UNTIL END-INDEX &gt; RECORD-LENGTH OR END-FOUND IF IN-RECORD(END-INDEX: FUNCTION LENGTH(STRING-MARKER-RIGHT)) = STRING-MARKER-RIGHT SET END-FOUND TO TRUE END-IF END-PERFORM COMPUTE END-INDEX = END-INDEX - START-INDEX - 1 END-COMPUTE DISPLAY IN-RECORD(START-INDEX:END-INDEX) END-DISPLAY END-IF END-PERFORM . EXIT-PROGRAM. CLOSE IN-FILE STOP RUN . </code></pre> <p></code></p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload