COBOL文件输入,用空格分隔的数字

时间:2014-02-01 07:47:38

标签: cobol

我是COBOL的新手,我遇到了以下问题。

我有一个包含内容的输入文件: 2 3 2 4

4个数字在同一行,并且只用一个空格分隔。 4个数字可以是1位,2位和3位

我可以用PIC将这4个数字放到4个变量中吗? 例如:PIC XXX XXX XXX XXX(这不起作用。)

目前我正在使用子字符串来完成任务,但这不是很有效率和杂乱,有没有其他方法可以轻松完成任务?

由于

4 个答案:

答案 0 :(得分:1)

你可以通过两种方式做到这一点。第一是使用unstring句子。或者你可以声明一个变量级别01,并在其中单独定义字符串的每个变量。

例如:

01 WS-FILE.
    05 WS-FIELD-01   PIC 9.
    05 FILLER        PIC X.
    05 WS-FIELD-02   PIC 9.
    05 FILLER        PIC X.
    05 WS-FIELD-03   PIC 9.
    05 FILLER        PIC X.
    05 WS-FIELD-04   PIC 9.
    05 FILLER        PIC X.

当您阅读文件时使用:

READ FILE INTO WS-FILE.

答案 1 :(得分:1)

你可以使用UNSTRING函数(我不知道你是否用子字符串来引用它)

  UNSTRING WS-FILE-RECORD DELIMITED BY SPACE
      INTO WS-FIELD1
           WS-FIELD2
           WS-FIELD3
           WS-FIELD4
  END-UNSTRING

如果您有:

  WS-FILE-RECORD="1 2 3 4"
  WS-FIELD1 = "1"
  WS-FIELD2 = "2"
  WS-FIELD3 = "3"
  WS-FIELD4 = "4"

或者如果你有:

  WS-FILE-RECORD="1 22 333 4444"
  WS-FIELD1 = "1"
  WS-FIELD2 = "22"
  WS-FIELD3 = "333"
  WS-FIELD4 = "4444"

答案 2 :(得分:0)

01  YOUR-NUMBERS.
    03 YOUR-NUMBER                     PIC 9(04) OCCURS 4.

01  INDEX-YOUR-NUMBERS                 PIC 9(01).

01  YOUR-RECORD.
    03 YOUR-RECORD-4.
       05 YOUR-RECORD-4-NUM            PIC X(04).
       05 FILLER                       PIC X(01).
       05 YOUR-RECORD-4-REST.
          07 FILLER                    PIC X(09).
          07 YOUR-RECORD-4-END         PIC X(05).

    03 YOUR-RECORD-3                   REDEFINES YOUR-RECORD-4.
       05 YOUR-RECORD-3-NUM            PIC X(03).
       05 FILLER                       PIC X(01).
       05 YOUR-RECORD-3-REST.
          07 FILLER                    PIC X(11).
          07 YOUR-RECORD-3-END         PIC X(04).

    03 YOUR-RECORD-2                   REDEFINES YOUR-RECORD-4.
       05 YOUR-RECORD-2-NUM            PIC X(02).
       05 FILLER                       PIC X(01).
       05 YOUR-RECORD-2-REST.
          07 FILLER                    PIC X(13).
          07 YOUR-RECORD-2-END         PIC X(03).

    03 YOUR-RECORD-1                   REDEFINES YOUR-RECORD-4.
       05 YOUR-RECORD-1-NUM            PIC X(01).
       05 FILLER                       PIC X(01).
       05 YOUR-RECORD-1-REST.
          07 FILLER                    PIC X(15).
          07 YOUR-RECORD-1-END         PIC X(02).


    MOVE SPACES TO YOUR-RECORD.
    READ YOUR-RECORD.
    PERFORM 0100-FIND-NUMBERS
        VARYING INDEX-YOUR-NUMBERS
       FROM 1
         TO 4.

0100-FIND-NUMBERS.
    IF YOUR-RECORD-4-NUM IS NUMERIC
      MOVE YOUR-RECORD-4-NUM           TO YOUR-NUMBER(INDEX-YOUR-NUMBERS)
      MOVE YOUR-RECORD-4-REST          TO YOUR-RECORD-4
      MOVE SPACES                      TO YOUR-RECORD-4-END
    ELSE
      IF YOUR-RECORD-3-NUM IS NUMERIC
        MOVE YOUR-RECORD-3-NUM         TO YOUR-NUMBER(INDEX-YOUR-NUMBERS)
        MOVE YOUR-RECORD-3-REST        TO YOUR-RECORD-4
        MOVE SPACES                    TO YOUR-RECORD-3-END
      ELSE
        IF YOUR-RECORD-2-NUM IS NUMERIC
          MOVE YOUR-RECORD-2-NUM       TO YOUR-NUMBER(INDEX-YOUR-NUMBERS)
          MOVE YOUR-RECORD-2-REST      TO YOUR-RECORD-4
          MOVE SPACES                  TO YOUR-RECORD-2-END
        ELSE
          MOVE YOUR-RECORD-1-NUM       TO YOUR-NUMBER(INDEX-YOUR-NUMBERS)
          MOVE YOUR-RECORD-1-REST      TO YOUR-RECORD-4
          MOVE SPACES                  TO YOUR-RECORD-1-END.

这是一种方法。也许不是一个好方法。也许不是一种有效的方法。也许不是一个简单的方法。但肯定是一种不涉及string/unstring的方式 - 仅使用PIC。杂交。

答案 3 :(得分:0)

你可以创建一个小的状态机来运行并计算每个数字。在解析时逐个字符地处理事物有很多好处。代码通常非常简单,特别是使用简单的正则表达式,如数字或空格。

 Identification Division.                           
 Program-ID. PARSENUM.                              
 Data Division.                                     
 Working-Storage Section.                           
 01 II      comp-5 pic s9(8) value 0.               
 01 Num-Val comp-5 pic s9(8) value 0.               
 01 In-Str pic x(80).                               
 01 In-Ch  pic 9.                                   
 01 pic x(1).                                       
   88 In-Number     value 'N'.                      
   88 In-Whitespace value 'W'.                      

 Procedure Division.                                
*> Fake up some data...                             
     Move '1 212 303 44 5678 6 75 888 976' to In-Str
*> Parse Numbers                                     
     Set In-Whitespace to true                       
     Perform varying II from 1 by 1                  
       until II > Length of In-Str                   

       If In-Str (II:1) is numeric                   

         Move In-Str (II:1) to In-Ch                 
         Evaluate true                               

           when In-Whitespace                        
             Compute Num-Val = In-Ch                 
             Set In-Number to true                   

           when In-Number                            
             Compute Num-Val = (Num-Val * 10) + In-Ch

         End-Evaluate                                

       Else                                          

         If In-Number                         
           Display 'Found Number: ' Num-Val   
           Set In-Whitespace to true          
         End-If                               

       End-If                                 

     End-Perform                              

     Goback.  

您应该获得如下输出:

Found Number: +0000000001
Found Number: +0000000212
Found Number: +0000000303
Found Number: +0000000044
Found Number: +0000005678
Found Number: +0000000006
Found Number: +0000000075
Found Number: +0000000888
Found Number: +0000000976