Чтение и переход к первой строке и другим строкам в файле

Как я могу прочитать файл .dat с такой структурой: ( A = ALPHANUMERIC && N = NUMERIC )

0AAAAAAAANNNN (233 BLANK SPACES ) 999999 ( SEQUENTIAL NUMBER ONE BY ONE )
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
9 (245 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)

Итак, я знаю, как я могу написать программу для чтения этого на C/C++ или C#, но я пытаюсь сделать на Cobol, просто для изучения....

Но я не знаю, какую команду мне нужно использовать, чтобы открыть файл в этом стиле (я просто знаю:

ORGANIZATION IS LINE SEQUENTIAL.

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

(мне просто нужно прочитать строку 1 вовремя, и мне нужно прочитать строку 2 и 3 всегда парные... 4 и 5 && 6 и 7 && 8 и 9...) и я хочу показать, что информация с ДИСПЛЕЙ (просто для изучения) Спасибо :)


person Alexandre    schedule 28.01.2013    source источник


Ответы (3)


Что-то вроде этого ниже вашего FD:

01  INPUT-RECORD.
    05  IR-RECORD-TYPE PIC X.
        88  INPUT-RECORD-IS-HEADER VALUE '0'.
        88  INPUT-RECORD-IS-DATA1 VALUE '1'.
        88  INPUT-RECORD-IS-DATA2 VALUE '2'.
        88  INPUT-RECORD-IS-TRAILER VALUE '9'.
    05  FILLER PIC X(whatever).

Вам может понадобиться «завершающий» байт для разделителя записи, я не знаю, и вам придется отсортировать длины, поскольку они кажутся разными.

Они в рабочем хранилище:

01  INPUT-RECORD-HEADER.
    05  IRH-RECORD-TYPE PIC X.
    05  IRH-ITEM1 PIC X(8).
    05  IRH-ITEM2 PIC 9(4).
    05  FILLER PIC X(233).
    05  IRH-SEQUENCE PIC X(6)
01  INPUT-RECORD-DATA1.
    05  IRD1-RECORD-TYPE PIC X.
    05  IRD1-ITEM1 PIC 9(14).
    05  IRD1-ITEM1 PIC X(19).
    05  FILLER PIC X(194).
    05  IRD1-SEQUENCE PIC X(6)
01  INPUT-RECORD-DATA2.
    05  IRD2-RECORD-TYPE PIC X.
    05  IRD2-ITEM1 PIC X(33).
    05  FILLER PIC X(194).
    05  IRD2-SEQUENCE PIC X(6)
01  INPUT-RECORD-TRAILER.
    05  IRT-RECORD-TYPE PIC X.
    05  FILLER PIC X(245).
    05  IRT-SEQUENCE PIC X(6).

Вы должны прочитать каждую запись, одну за другой. Определите это. Поместите это в правильное определение W-S. Когда вы читаете «2», вы можете обработать «1», которую вы сохранили вместе с «2».

Мои имена данных не очень хороши, так как я не знаю, какие у вас данные. Также я не «форматировал» определения, что сделает их более читабельными, когда вы это сделаете.

person Bill Woodger    schedule 28.01.2013

Для OpenCOBOL вот пример программы стандартного входа/стандартного выхода:

   >>SOURCE FORMAT IS FIXED
  *> ***************************************************************
  *><* ===========
  *><* filter
  *><* ===========
  *><* :Author:    Brian Tiffin
  *><* :Date:      20090207
  *><* :Purpose:   Standard IO filters
  *><* :Tectonics: cobc -x filter.cob
  *> ***************************************************************
   identification division.
   program-id. filter.

   environment division.
   configuration section.

   input-output section.
   file-control.
       select standard-input assign to keyboard.
       select standard-output assign to display.

   data division.
   file section.
   fd standard-input.
       01 stdin-record     pic x(32768).
   fd standard-output.
       01 stdout-record    pic x(32768).

   working-storage section.
   01  file-status         pic x  value space.
       88 end-of-file             value high-value
          when set to false is          low-value.

  *> ***************************************************************
   procedure division.
   main section.
   00-main.

   perform 01-open

   perform 01-read

   perform
        until end-of-file
            perform 01-transform
            perform 01-write
            perform 01-read
   end-perform
   .

   00-leave.
   perform 01-close
   .

   goback.
  *> end main

   support section.
   01-open.
   open input standard-input
   open output standard-output
   .

   01-read.
   read standard-input
        at end set end-of-file to true
   end-read
   .

  *> All changes here
   01-transform.
   move stdin-record to stdout-record
   .
  *>

   01-write.
   write stdout-record end-write
   .

   01-close.
       close standard-input
       close standard-output
   .

   end program filter.
  *><*
  *><* Last Update: dd-Mmm-yyyy

а вот демонстрация использования LINAGE, которая просто читает текстовый файл.

  *****************************************************************
  * Example of LINAGE File Descriptor
  * Author: Brian Tiffin
  * Date:   10-July-2008
  * Tectonics: $ cocb -x linage-demo.cob
  *            $ ./linage-demo <filename ["linage-demo.cob"]>
  *            $ cat -n mini-report
  *****************************************************************
   IDENTIFICATION DIVISION.
   PROGRAM-ID. linage-demo.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      select optional data-file assign to file-name
          organization is line sequential
          file status is data-file-status.
      select mini-report assign to "mini-report".

   DATA DIVISION.
   FILE SECTION.
   FD  data-file.
   01  data-record.
      88 endofdata        value high-values.
      02 data-line        pic x(80).
   FD  mini-report
      linage is 16 lines
          with footing at 15
          lines at top 2
          lines at bottom 2.
   01  report-line         pic x(80).

   WORKING-STORAGE SECTION.
   01  command-arguments   pic x(1024).
   01  file-name           pic x(160).
   01  data-file-status    pic 99.
   01  lc                  pic 99.
   01  report-line-blank.
      02 filler           pic x(18) value all "*".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(34)
          VALUE "THIS PAGE INTENTIONALLY LEFT BLANK".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(18) value all "*".
   01  report-line-data.
      02 body-tag         pic 9(6).
      02 line-3           pic x(74).
   01  report-line-header.
      02 filler           pic x(6) VALUE "PAGE: ".
      02 page-no          pic 9999.
      02 filler           pic x(24).
      02 filler           pic x(5) VALUE " LC: ".
      02 header-tag       pic 9(6).
      02 filler           pic x(23).
      02 filler           pic x(6) VALUE "DATE: ".
      02 page-date        pic x(6).

   01  page-count          pic 9999.

   PROCEDURE DIVISION.

   accept command-arguments from command-line end-accept.
   string
      command-arguments delimited by space
      into file-name
   end-string.
   if file-name equal spaces
      move "linage-demo.cob" to file-name
   end-if.

   open input data-file.
   read data-file
      at end
          display
               "File: " function trim(file-name) " open error"
          end-display
          go to early-exit
   end-read.

   open output mini-report.

   write report-line
      from report-line-blank
   end-write.

   move 1 to page-count.
   accept page-date from date end-accept.
   move page-count to page-no.
   write report-line
      from report-line-header
      after advancing page
   end-write.

   perform readwrite-loop until endofdata.

   display
      "Normal termination, file name: "
      function trim(file-name)
      " ending status: "
      data-file-status
   end-display.
   close mini-report.

  * Goto considered harmful?  Bah!  :)
   early-exit.
   close data-file.
   exit program.
   stop run.

  ****************************************************************
   readwrite-loop.
   move data-record to report-line-data
   move linage-counter to body-tag
   write report-line from report-line-data
      end-of-page
          add 1 to page-count end-add
          move page-count to page-no
          move linage-counter to header-tag
          write report-line from report-line-header
              after advancing page
          end-write
   end-write
   read data-file
      at end set endofdata to true
   end-read
   .

  *****************************************************************
  * Commentary
  * LINAGE is set at a 20 line logical page
  *  16 body lines
  *   2 top lines
  *   A footer line at 15 (inside the body count)
  *   2 bottom lines
  * Build with:
  * $ cobc -x -Wall -Wtruncate linage-demo.cob
  * Evaluate with:
  * $ ./linage-demo
  * This will read in linage-demo.cob and produce mini-report
  * $ cat -n mini-report
  *****************************************************************
   END PROGRAM linage-demo.

С этими примерами, наряду с ответом Гилберта, у вас должно быть достаточно для решения вашей проблемы, с оговоркой, что эти примеры стесняются правильной обработки ошибок, поэтому будьте осторожны, это домашнее задание или оплачиваемое задание. Пример стандартного ввода/вывода или по имени файла в зависимости от аргументов командной строки (или их отсутствия) см. в программе ocdoc.cob в FAQ по OpenCOBOL.

Не по теме: вывод передачи ocdoc поверх самого ocdoc.cob можно увидеть по адресу http://opencobol.add1tocobol.com/ocdoc.html (Зачем упоминать об этом? Подсветка лексики COBOL для Pygments только что была принята в main. Любые Pygments, извлеченные после версии 1.6, допускают лексическую подсветку COBOL (без контекста).)

person Brian Tiffin    schedule 28.01.2013

Вы пишете обычную программу на Коболе, которая читает файл.

Первый байт (символ) записи равен 0, 1, 2 или 9.

Определите рабочую область хранения (уровень 01) для каждого из 4 типов записей. Затем, прочитав запись, вы перемещаете ее из области ввода в соответствующую область рабочей памяти для записи.

Затем вы обрабатываете запись, как хотите, из одной из 4 рабочих областей хранения.

person Gilbert Le Blanc    schedule 28.01.2013