Буферизация данных COBOL без перемещения символ за символом - PullRequest
0 голосов
/ 24 мая 2011

Я читаю входной файл переменной длины и хочу создать выходной буфер (индексированную таблицу), который не будет использовать символ за перемещением символа.

Например: моя первая входная запись содержит 79 символов, язатем можно переместить это на уровень моей группы в таблице.Моя вторая входная запись состоит из 101 символа - как я могу взять эти 101 символ и поместить их в мою таблицу, начиная с позиции 80 на длину 101?И следующая входная запись начинается с позиции 180 ..... и т. Д.В настоящее время мы выполняем изменение 1 на 1, но это невероятно загружает процессор по сравнению с перемещением блока по начальному адресу.

Мы делаем это миллионы раз в день, и решение было бы весьма полезным.

Ответы [ 3 ]

2 голосов
/ 25 мая 2011

Использовать ссылочную модификацию с длиной из вашей записи. Рассмотрим:

01 Record
  05 Rec-LL  Pic S9(4) Binary.
  05 Rec-Data Pic X(32767).
01 Tgt-Area Pic X(10000000).
01 Curr-Ptr   Pic S9(8) Binary.

Как только вы прочитаете свою запись, вы можете двигаться в зависимости от длины, например, так:

   Move 1 to Curr-Ptr
   Perform Get-Next-Record
   Perform until no-more-data
      Move Rec-Data (1:Rec-LL) to Tgt-Area (curr-ptr:rec-LL)
      Compute Curr-Ptr = Curr-Ptr + Rec-LL
      Perform Get-Next-Record
   End-Perform
0 голосов
/ 17 января 2013

Взгляните на глагол STRING INTO, в частности предложение WITH POINTER . Не забывайте об обязательном ПЕРЕКЛЮЧЕНИИ при соединении вещей вот так.

Для получения подробной информации возьмите копию Руководства программиста OpenCOBOL Гэри Катлера.

http://opencobol.add1tocobol.com/OpenCOBOL%20Programmers%20Guide.pdf

Это руководство на языке COBOL мирового уровня, открытый и бесплатный документ (GNU FDL).

0 голосов
/ 25 мая 2011

Или по старинке (мы говорим на Коболе, вот так старомодно = юрский): -

    01 Record.
       05 REC-LL           PIC S9(4) Binary.
       05 REC-DATA.
          10  REC-BYTES PIC X OCCURS 32767 times depending on REC-LL.

    01 TARGET-AREA.
       05 TARGET-HEADER       PIC X(79).
       05 TARGET-REC          PIC X(101) OCCURS 50 TIMES.

    01 TGT-INDEX              PIC S9(8) BINARY VALUE 1.

   *  Length calculation happens by magic!

       Perform Read-Record.
       move REC-DATA TO TARGET-HEADER.
       perform until no-more-data 
           Perform Read-Record
           move REC-DATA to TARGET-RED(TGT-INDEX)
           add +1 to TGT-INDEX
       end-perform

Или, если записи действительно варьируются от 1 до 101 байта:

    01 Record.
       05 REC-LL           PIC S9(4) Binary.
       05 REC-DATA.
          10  REC-BYTES PIC X OCCURS 32767 times depending on REC-LL.

    01 TARGET-AREA.
       05 TGT-LL              PIC s9(8) BINARY.
       05 TGT-REC.
          10  TGX-BYTE        OCCURS 3175 depending on TGT-LL.
       05 TGT-EXTRA           PIC X(101). 




       Perform Read-Record.
       Move +0 to tgt-LL.
       perform until no-more-data
           MOVE REC-DATE to TGT-EXTRA
           ADD REC-LL TO TGT-LL
           Perform Read-Record
           add +1 to TGT-INDEX
       end-perform
...