Как удалить пробелы при создании документа CSV - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть программа, которая создает документ 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 голосов
/ 19 апреля 2019

Вы можете использовать функцию TRIM () для удаления пробелов, если вы используете GnuCOBOL (OpenCOBOL) в Linux.

   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 для сборки окончательного текстового поля уже было предложено другим форумом, я тольковключите его сюда, чтобы завершить пример.

0 голосов
/ 19 апреля 2019

Вы можете попытаться сделать цикл (PERFORM UNTIL) для каждого символа, и если это пробел, то измените его на 0.

0 голосов
/ 19 апреля 2019

Основываясь на нашем разговоре и другой информации, я немного изменил код. Я удалил все ссылки на 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

Это только перемещает пробелы от числа до запятой. Будет ли этого достаточно, зависит от того, удалит ли следующая программа завершающие пробелы.

...