2015-04-22 6 views
0

Мой офис использует встроенный инструмент, который может генерировать программу форматирования COBOL, загрузку программы COBOL File в DB2 и другие связанные объекты из DDL. Обычно загружаемые файлы разделяются символом '|' но новый источник данных отправляет только файлы, разделенные запятой.Игнорирование запятых в кавычках в программе форматирования COBOL

Проблема, с которой я столкнулся, заключается в том, что некоторые текстовые поля содержат в себе запятые, и первое, что делает программа форматирования после прочтения записи во входных данных, выполняется проверкой/подсвечностью, чтобы проверить правильность количества разделителей. в записи. Если подсчитывается слишком много разделителей, запись отбрасывается. Когда запятая находится в текстовом поле, она не выполняет запись, потому что она не может отличить запятую от поля и разделителя.

К счастью, все текстовые поля окружены кавычками ", поэтому я собираюсь написать код, который будет проверять каждый символ записи по одному, сохраняя подсчет котировок, и если он встречается с запятой, а счетчик котировок нечетное число, это будет игнорировать запятую и не считать ее в подсчете.

Любые предложения о том, как это сделать?

+0

Можно ли считать z/OS, или это LUW DB2? –

+0

О да, извините, я забыл о том, что это z/OS – mmackenzie93

+0

Вы * можете * сделать это в COBOL, примерно так, как вы начертили, но вы можете захотеть использовать SORT для принятия/отклонения файла. Вы можете подсчитать запятые, подсчитать кавычки и запятую минус (кавычки разделены на два) - это количество полей. Если вы хотите это учесть, вы можете задать другой вопрос либо с тегом DFSORT, либо с SyncSORT (в зависимости от того, что у вас есть), а также включить ссылку на версию вашего продукта. –

ответ

2

Предполагается, что вы знаете, сколько данных имеется в строке (максимально, если длина переменной) для длины данных в строке, и что вы замените OCCURS 1000 на максимальную длину линия.

Идея заключается в использовании переключателя включения-выключения. Первым делом в EVALUATE является проверка котировки. Если найдено, переверните переключатель. Далее следует сказать, включен ли переключатель, игнорируйте этот байт. Далее, если это запятая, посчитайте ее.

Как только PERFORM будет завершено, счетчик будет содержать общее количество запятых, не содержащих кавычек.

Названия данных, которые я выбрал, предназначены для иллюстрации техники. Вы меняете те, которые имеют отношение к вашей задаче.

01 length-of-data-on-the-line 
           COMP PIC 9(4). 

01 the-line. 
    05 FILLER OCCURS 1000 TIMES. 
     10 character-on-the-line PIC X. 
      88 cotl-is-comma  VALUE COMMA. 
      88 cotl-is-quote  VALUE QUOTE. 

01 FILLER. 
    05 FILLER      PIC X. 
     88 on-off-switch-on  VALUE "1". 
     88 on-off-switch-off  VALUE "7". 

01 the-count     COMP PIC 9(4). 
01 data-on-line-sub   COMP PIC 9(4). 


MOVE ZERO     TO the-count 
           data-on-line-sub 
SET on-off-switch-off  TO TRUE 
PERFORM 
    length-of-data-on-the-line TIMES 
    ADD 1     TO data-on-line-sub 
    EVALUATE TRUE 
     WHEN cotl-is-quote (data-on-line-sub) 
     IF on-off-switch-off 
      SET on-off-switch-on 
          TO TRUE 
     ELSE 
      SET on-off-switch-off 
          TO TRUE 
     END-IF 
     WHEN on-off-switch-on 
     CONTINUE 
     WHEN cotl-is-comma (data-on-line-sub) 
     ADD 1    TO the-count 
    END-EVALUATE 
END-PEFORM 
+0

Хорошо, приветствует это, имеет смысл и выглядит так, как будто это сработает. Мне дали кусочек селькопии, который выполняет эту работу. После того, как он будет реализован и запущен, я попробую добавить его в код, чтобы удалить дополнительный шаг для запуска selcopy. Думаю, лучше держать все в одной программе. – mmackenzie93

+0

@ mmackenzie93 обязательно скомпилируйте с опцией QUOTE, а не с параметром APOST. – cschneid

+0

@ mmackenzie93 Комментарий пользователя cschneid сводится к использованию фигуративной константы QUOTE, которая с опцией компилятора QUOTE будет использовать '' 'и с APOST будет использовать' ''. Если люди склонны обсуждать этот вариант компилятора, у вас есть два других способа сделать это. «VALUE» «» или с помощью шестнадцатеричного VALUE. Я, вероятно, обнов свой ответ завтра. –