创建CSV文档时如何删除空格

时间:2019-04-19 07:43:13

标签: cobol

我有一个创建CSV文档的程序。数据库表中的一个字段Z-ZYSR-MONTAN(IZYSR)的格式为NOT NULL NUMBER(11,2)

我的代码是:

      05  H-ZYSR-MONTAN           PIC S9(11)V9(2) COMP-3.

* Taux horaire formation
      05  W-Z18                  PIC -(12),99.
      05  FILLER                 PIC X(001) VALUE ';'.
 ALIM-WZ18 SECTION.
     MOVE Z-ZYSR-NOMBRE TO IZYSR.
     MOVE ZERO TO H-ZYSR-MONTAN.

     IF Z-ZYSR-NOMBRE > ZERO
         PERFORM VARYING IZYSR FROM Z-ZYSR-NOMBRE BY -1 UNTIL
                                 IZYSR = ZERO
              IF Z-ZYSR-CODRUB(IZYSR) = 'THF'
                   MOVE Z-ZYSR-MONTAN(IZYSR) TO
                        H-ZYSR-MONTAN
                   MOVE ZERO TO IZYSR
              END-IF
         END-PERFORM
         IF H-ZYSR-MONTAN < 0
              MOVE 0 TO W-Z18
         END-IF
         IF H-ZYSR-MONTAN >= 0
              MOVE H-ZYSR-MONTAN TO W-Z18
         END-IF
     END-IF.

结果:

    2223,55
     -10,98
      -1,08
      82,61

但是我的CSV文档中存在的问题是数字之前有空格。如本论坛图片所示:

https://www.developpez.net/forums/d1940330/autres-langages/autres-langages/cobol/numerique-condense-cobol/#post10895608

所以我的问题是如何在数字前没有空格的情况下获得正确的结果?

3 个答案:

答案 0 :(得分:0)

根据我们的对话和其他信息,我对代码进行了一些更改。我删除了所有对CSV的引用,因为这似乎发生在COBOL程序之外。我替换了STRING语句。其他参考文献中未提供包含W-Z18;的组的数据名称,因此在这里我将其命名为W-Z18-FIELD。我将结果放在W-Z18-TEXT中。

   environment division.
   configuration section.
   special-names.
       decimal-point is comma.
   data division.
   working-storage section.
   1 w-z18-text pic x(16) value space.
   1 w-z18-pointer comp pic 9(4) value 1.
   1 w-z18-field.
  * Taux horaire formation
     3 w-z18 pic -(12),99.
     3 pic x value ";".
   1 leading-spaces comp pic 9(4) value 0.
   1 move-length comp pic 9(4) value 0.
   procedure division.
   begin.
       move -10,98 to w-z18
       move 0 to leading-spaces
       inspect w-z18 tallying
           leading-spaces for leading space
       compute move-length =
           function length (w-z18 (leading-spaces + 1:))
       move space to w-z18-text
       move 1 to w-z18-pointer
       move w-z18 (leading-spaces + 1:)
           to w-z18-text (w-z18-pointer:move-length)
       compute w-z18-pointer = w-z18-pointer + move-length
       move ";" to w-z18-text (w-z18-pointer:1)
       add 1 to w-z18-pointer
       display quote w-z18-field quote
       display quote w-z18-text quote
       stop run
       .

结果:(添加引号以显示更改)

"         -10,98;" - what it looked like before, w-z18-field
"-10,98;         " - with the changes, w-z18-text

这只会将空格从数字前移到分号后。这是否足够取决于下一个程序是否删除尾随空格。

答案 1 :(得分:0)

如果在Linux上使用GnuCOBOL(OpenCOBOL),则可以使用TRIM()函数删除空格。

   WORKING-STORAGE SECTION.
   01.
       05  H-ZYSR-MONTAN           PIC S9(11)V9(2) COMP-3.
       05  W-Z18                   PIC -(12).99.
       05  H-Z18-C REDEFINES W-Z18 PIC X(15).
       05  H-ZYSR-DISPLAY          PIC X(15).


   PROCEDURE DIVISION.
   0000-MAIN.

       MOVE 1234.56 TO H-ZYSR-MONTAN.
       move H-ZYSR-MONTAN to W-Z18.

       MOVE FUNCTION TRIM(H-Z18-C) TO H-ZYSR-DISPLAY.
       DISPLAY H-ZYSR-DISPLAY.

       STOP RUN.      

我确实必须将更改为。匹配我的语言环境,因此请记住将其更改回原样。

如果您无法使用该功能,可以通过简单的方法解决。

       WORKING-STORAGE SECTION.
       01.
           05  H-ZYSR-MONTAN           PIC S9(11)V9(2) COMP-3.
           05  W-Z18                   PIC -(12).99.
           05  VAR-Z18                 PIC X(15).
           05  ws-counter              pic 9(3) COMP-3 value 0.

       01 VARIABLES.
           05 VAR1                     PIC X(10).
           05 VAR2                     PIC X(10).
           05 VAR3                     PIC X(10).
           05 VAR4                     PIC X(10).
           05 VAR5                     PIC X(10).
           05 VAR6                     PIC X(10).
           05 VAR7                     PIC X(10).
           05 VAR8                     PIC X(10).

       01 WS-DELIMITED-TEXT            PIC X(200).

       PROCEDURE DIVISION.
       0000-MAIN.

           INITIALIZE VARIABLES
           MOVE 'CEX18'  TO VAR6
           MOVE -1234.56 TO H-ZYSR-MONTAN 

           MOVE H-ZYSR-MONTAN TO W-Z18
           INSPECT W-Z18 TALLYING WS-COUNTER FOR LEADING SPACES
           IF WS-COUNTER > 0 
              COMPUTE WS-COUNTER = WS-COUNTER + 1
              MOVE W-Z18(ws-counter:) TO VAR-Z18
           ELSE 
               MOVE W-Z18             TO VAR-Z18
           END-IF

           String VAR1 delimited by SPACE
                   ";" delimited by size
                  VAR2 delimited by SPACE
                  ";" delimited by size   
                  VAR3 delimited by SPACE
                  ";" delimited by size   
                  VAR4 delimited by SPACE
                  ";" delimited by size  
                  VAR5 delimited by SPACE
                  ";" delimited by size  
                  VAR6 delimited by SPACE
                  ";" delimited by size  
                   VAR-Z18 delimited by SPACE
                  ";" delimited by size  
                  VAR7 delimited by SPACE
                  ";" delimited by size  
                  VAR8 delimited by SPACE
                  ";" delimited by size  
            into WS-DELIMITED-TEXT
            DISPLAY WS-DELIMITED-TEXT.

           GOBACK.

另一个论坛已经建议使用STRING来组装最终文本字段,我仅在此处添加它来完善示例。

答案 2 :(得分:0)

对于每个字符,您可以尝试进行一个循环(执行直到),如果它是SPACE,则将其更改为0。