重新格式化数据,不带分隔符的数字

时间:2015-07-13 08:00:01

标签: cobol

我有一个包含文章编号的字段(PIC X(25))。

示例商品编号:12345-6789。

问题是" - ",我需要删除" - "并将5和6放在一起,结果示例:123456789

使用在UNIX服务器上运行的Micro Focus Net Express 5.1。破折号的位置不固定。

3 个答案:

答案 0 :(得分:1)

使用此代码进行旋转。

更新:好抓,比尔。我只想根据需求和要求提供选择。

   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SPECIAL-NAMES.
  *    ClassIncludeList and ClassExcludeList can now be referenced much like NUMERIC
       CLASS ClassIncludeList IS '0123456789'
       CLASS ClassExcludeList IS '-'
       .

   WORKING-STORAGE SECTION.

   01  InputStringText              PIC X(1000).
   01  InputStringLength            PIC 9(04) COMP.
   01  OutputStringText             PIC X(1000).
   01  OutputStringLength           PIC 9(04) COMP.
   01  ByteSubscript                PIC 9(04) COMP.

   PROCEDURE DIVISION.

       MOVE article-numbers TO InputStringText.
       MOVE FUNCTION LENGTH(article-numbers) TO InputStringLength.

       PERFORM IncludeCharacters.
  *    Use OutputStringText(OutputStringLength)

       PERFORM ExcludeCharacters.
  *    Use OutputStringText(OutputStringLength)

   IncludeCharacters.
       MOVE SPACES TO OutputStringText
       MOVE ZERO TO OutputStringLength
       PERFORM
         VARYING ByteSubscript FROM 1 BY 1
           UNTIL ByteSubscript > InputStringLength
               IF (InputStringText(ByteSubscript:1) IS ClassIncludeList)
                   ADD 1 TO OutputStringLength
                   MOVE InputStringText(ByteSubscript:1)
                     TO OutputStringText(OutputStringLength:1)
               END-IF
       END-PERFORM
       .

   ExcludeCharacters.
       MOVE SPACES TO OutputStringText
       MOVE ZERO TO OutputStringLength
       PERFORM
         VARYING ByteSubscript FROM 1 BY 1
           UNTIL ByteSubscript > InputStringLength
               IF (InputStringText(ByteSubscript:1) IS ClassExcludeList)
                   CONTINUE
               ELSE
                   ADD 1 TO OutputStringLength
                   MOVE InputStringText(ByteSubscript:1)
                     TO OutputStringText(OutputStringLength:1)
               END-IF
       END-PERFORM
       .

答案 1 :(得分:0)

以下内容适用于任何现代COBOL:

01  INPUT-STRING    PIC X(25).
01  OUTPUT-STRING   PIC X(25).
01  IX              PIC S9(8) COMP SYNC.
01  OX              PIC S9(8) COMP SYNC.

...

MOVE +1 TO OX.
MOVE ALL ' ' TO OUTPUT-STRING.
PERFORM VARYING IX FROM 1 BY 1
          UNTIL IX > 25
     IF NOT INPUT-STRING(IX:1) = '-'
     THEN
         MOVE INPUT-STRING(IX:1) TO OUTPUT-STRING(OX:1)
         ADD +1 TO OX
     END-IF
END-PERFORM. 

答案 2 :(得分:0)

如果您的Cobol支持它们,那么总是UNSTRINGSTRING,并且如果有多少'部分有限制。文中会有。

01  ARTICLE-NUMBER         PIC X(25).
01  PARTS.
    05 PART1               PIC X(25).
    05 PART2               PIC X(25).
    05 PART3               PIC X(25).
    05 PART4               PIC X(25).
01  RESULT                 PIC X(25).

........

INITIALIZE PARTS, RESULT.
UNSTRING ARTICLE-NUMBER
   DELIMITED BY '-'
   INTO PART1, PART2, PART3, PART4
   ON OVERFLOW
      DISPLAY "Too many parts!!!"
END-UNSTRING.
STRING PART1, PART2, PART3, PART4
       DELIMITED BY SPACE INTO RESULT.

希望这有帮助。