0

TELON/COBOL atm を使用しています。文字列から単語を抽出するアルゴリズムが必要です。検索してみましたが、似たようなものは見つかりませんでした。

とにかく、アルゴリズムは単語を抽出し、スペースを無視する必要があります。ここに私がこれまでに持っているものがあります(e構文に慣れていない人のためにコメントを入れました)

WS-STRING は入力文字列です

WS-WORD-LEN は、抽出する単語の長さです

WS-LST-WORD-P は、抽出する現在の単語の開始位置です (文字列内)。

WS-SUB1 はループ インデックスです。

PERFORM TEST BEFORE                                      
VARYING WS-SUB1 FROM 1 BY 1                              
  UNTIL WS-SUB1 > WS-STRING-LEN //loop for each char in the string, add 1 to WS-SUB1 in each itiaration                         
    EVALUATE TRUE                                        
       WHEN WS-STRING(WS-SUB1:1) = SPACES  //if the current char is a space              
            MOVE WS-SUB1              TO WS-SUB1-FRD     
            ADD  1                    TO WS-SUB1-FRD     
            IF WS-STRING(WS-SUB1-FRD:1) = SPACES  //Checks to see if the next char is a space       
                ADD  1                TO WS-LST-WORD-P   
            ELSE                                         
                MOVE WS-STRING(WS-LST-WORD-P:WS-WORD-LEN) //Substing "WS-WORD-LEN" many char from "WS-STRING" starting at "WS-LST-WORD-P" into "WS-WORD-OUT" 
                                      TO WS-WORD-OUT     
                ADD  1                TO WS-COUNT(2)     
                PERFORM Z-400-OUTPUT-WORD  //This outputs "WS-WORD-OUT" to a file.              
                MOVE WS-SUB1          TO WS-LST-WORD-P   
                MOVE 1                TO WS-WORD-LEN   
            END-IF                                     
       WHEN OTHER                                      
            ADD  1                    TO WS-WORD-LEN   
    END-EVALUATE                                       
END-PERFORM                                            
MOVE 1                               TO WS-LST-WORD-P  

このアルゴリズムは機能しますが、出力の一部が最初/最後でつなぎ合わされます。ここで何が問題なのか、またはより良いものを提案するアイデアはありますか?

4

2 に答える 2

3

UNSTRINGを見たことがありますか?それはあなたの状況に合わせて作られたように見えるでしょう。

MOVE 1 TO WS-SUB1
PERFORM UNTIL WS-SUB1 >= LENGTH OF WS-STRING
  UNSTRING WS-STRING DELIMITED SPACE
    INTO WS-WORD-OUT COUNT IN WS-WORD-LEN
    POINTER WS-SUB1
  END-UNSTRING
  ADD 1 TO WS-COUNT(2)
  PERFORM Z-400-OUTPUT-WORD
  ADD WS-WORD-LEN TO WS-SUB1
END-PERFORM

注意:コードはフリーハンドで、コンパイルもテストもされていません。

于 2012-07-03T11:47:07.430 に答える
2

@cschneidは正しいです。UNSTRING が最適です。複数のスペースを 1 つの区切り文字として扱う場合は、DELIMITED BY ALL SPACES を使用します。http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/c0925395564.htmに例があります。

後ですべてを元に戻す必要がある場合は、STRING 動詞を使用してそれを行うことができます。ON OVERFLOW 句を使用して、長すぎてターゲット変数に収まらない単語などをキャッチすることもお勧めします。それは起こります。

于 2012-07-03T16:10:31.317 に答える