Можно ли прочитать файл в COBOL с записью данных переменной длины? - PullRequest
0 голосов
/ 17 апреля 2019

После многих лет, отведенных от программирования, я решил снова заняться этим ради удовольствия и получаю удовольствие от этого. В процессе поиска вещей для кодирования я обнаружил, что эти данные открыто доступны в Network Rail в Великобритании.

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

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

BSNY819581902281902280001000 PEE5A99    122112002 EMU390 125                  
BX         VTY                                                                  
LOMNCRPIC 2131 00008  FL     TB                                                 
LIARDWCKJ           2133 00000000                                               
LISLDLJN            2134H00000000   SL                   H                      
LIHTNOJN            2138 00000000   FL                  1H                      
LISTKP              2140H000000002  SL                                          
LISTKPE1            2141H00000000                                               
LIADSWDRD           2142H00000000                                               
LICHDH              2143 000000002                                              
LIWLMSL             2146 000000004                      1                       
LIALDEDGE           2148 00000000                     1 3                       
LISBCH              2200 000000001  FL                                          
LICREWSBG           2203 00000000                                               
LICREWUML           2204 00000000                                               
LICREWE             2206 000000001  FL                   H                      
LICREWBHJ           2207H00000000                       1                       
LIMADELEY           2212 00000000   FL FL               5H                      
LINTNB              2222H00000000   FL FL                                       
LISTAFFDJ           2226H00000000   SL                                          
LISTAFFRD 2228H2231H     000000004  SL SL A C                                   
LISTAFTVJ           2233 00000000                                               
LIPNKRDG            2236H00000000                     1 1                       
LIBSBYJN            2244 00000000                                               
LIPBLJWM            2248 00000000                                               
LIDRLSTNJ           2251H00000000                                               
LIBSCTSTA           2252H00000000                     1                         
LIPRYBRNJ           2257 00000000                       7                       
LIASTON             2306H000000002                                              
LISTECHFD           2311H00000000                                               
LIBHAMINT           2315 000000004                                              
LIBKSWELL           2318H00000000                       1H                      
LICOVNTRY           2324 000000001                    2 3                       
LIRUGBTVJ           2336 00000000   UNL                 3                       
LIRUGBY             2340 000000005  UNLUNL              1H                      
LIHMTNJ             2343 00000000                       1H                      
LIDVNTYNJ           2346H00000000                                               
LILNGBKBY           2351 00000000                     1 1                       
LINMPTN             0001H000000001                      6                       
LIHANSLPJ           0016 00000000   SL                                          
LIMKNSCEN           0021 000000001  SL SL                                       
LIBLTCHLY           0023 000000004  SL SL             5 1H                      
LILEDBRNJ           0036 00000000   SL SL               2                       
LITRING             0042 000000002  SL SL               2H                      
LIBONENDJ           0048H00000000   SL SL               1H                      
LIWATFDJ            0056 000000009  SL SL               1H                      
LIHROW              0101H000000006  SL SL               3                       
LIWMBY              0107H000000006  CL                                          
LTWMBYICD 0117H0000      TF 

tl; dr; первые две строки описывают, какой тип поезда движется, когда он движется, как быстро и т. Д. Другие строки описывают точки, которые пройдет поезд, и в какое время они должны это сделать. Основной вывод заключается в том, что каждая запись имеет различную длину в зависимости от поездки.

Когда я увидел это, я подумал: «Это была бы отличная вещь, чтобы попытаться возиться с Коболом». Я пошел в политехникум и изучил PASCAL и COBOL, но мне приходилось иметь дело только с файлами одинаковой длины и согласованными данными, а не с чем-то вроде этого.

Я потратил пару часов, пытаясь найти какой-то ответ на этот вопрос в Google, но на самом деле ничего не показывало, отсюда и мой вопрос.

Просто для справки, мне удалось сделать это в GW-BASIC, и я мог бы сделать это в элементарном Python, если это необходимо, но COBOL, будучи тем, чем он является, является совершенно другим котлом с рыбой.

Можно ли прочитать что-то подобное в COBOL, не прибегая к колдовству, или это просто «слишком жесткая» корзина? Я делаю это только для удовольствия, так что на самом деле ничего страшного.

Любые ответы или отзывы будут приветствоваться.

Большое спасибо,

Джозеф.

Ответы [ 4 ]

2 голосов
/ 18 апреля 2019

На самом деле (после переформатирования вопроса) я думаю, что КОБОЛ идеально подходит для этой работы, поскольку данные имеют фиксированную длину (может быть и из COBOL, тоже ...)

  • определить файл (последовательный строчный может даже не понадобиться, если он содержит, как ваш пост даже конечные пробелы; но, как это может измениться, последовательный строковый будет хорошо)
  • OPEN INPUT file, READ до конца файла
  • поместить полную прочитанную запись в локальную запись с определенными подполями и просто получить доступ к данным из подполей, после проверки (файл может быть поврежден по многим причинам)

В зависимости от количества строк в этих данных вы можете либо обработать записи напрямую, переместить их в таблицу (посмотрите на OCCURS) или WRITE их в другой файл (вероятно, и INDEXED с помощью несколько KEY определений)

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

Входные файлы COBOL могут быть переменными или фиксированными.Если это переменная, первые позиции будут числом столбцов в строке.

Здесь вы найдете информацию на официальной веб-странице IBM. Обработка файлов с записями переменной длины

1 голос
/ 18 апреля 2019

Чтобы расширить ответ @Simon Sobisch.

Глядя на данные и пытаясь их обработать, я вижу эти вещи.

Две верхние строки, как вы говорите, - это тип поезда и тому подобное.

Тогда у вас есть строка, начинающаяся с LO, которая должна быть началом пути. Следующими 7 символами будет станция, причем MNCRPIC предположительно будет «Манчестер Пикадили». Тогда есть пробел, затем четыре цифры, которые будут временем.

Тогда у вас есть множество линий, начинающихся с LI, которые являются промежуточными точками. У некоторых из них есть буква «H», а у других нет. Это будет проблемой, если вы собираетесь сделать UNSTRING DELIMITED BY SPACE. Я собираюсь предположить, что H означает остановку.

LISTAFFRD 2228H2231H     000000004  SL SL A C

странная линия.

В конце у нас есть LT, который является концом пути, прибывающим в WMBYICD в 0117.

   01 TRAIN-SCHEDULE.
       03 RECORD-TYPE PIC XX.
       88 JOURNEY-START VALUE 'LO'.
       88 JOURNEY-INTERMEDIATE VALUE 'LI'.
       88 JOURNEY-TERMINATE VALUE 'LT'.
       03 TRAIN-STATION PIC X(7).
       03 FILLER PIC X(11).
       03 TRAIN-TIME.
         05 TRAIN-TIME-HH PIC 99.
         05 TRAIN-TIME-MM PIC 99.
       03 TRAIN-HALT-FLAG PIC X.
       88 TRAIN-STOPS-HERE VALUE 'H'.

И так далее.

1 голос
/ 17 апреля 2019

Да возможно. Для файла используйте Line Sequential

Определение файла

select lineseq assign to "lineseq.dat"
     organization is line sequential.

Чтобы разбить строки, используйте UNSTRING . т.е.

UNSTRING in-line
   DELIMITED BY SPACES
   into  item-1, item-2, item-3
END-UNSTRING

Вероятно, это проще сделать на таких языках, как python

...