Разделение наборов данных мейнфрейма на основе заголовка

Мне нужно разделить набор данных мэйнфрейма на множество наборов данных в зависимости от часа от времени. Формат файла:

<Timestamp> First record
<data>Second record
<data>third record
<data>
<Timestamp>

Здесь я должен принять во внимание отметку времени и разделить набор данных на почасовой основе. Скажем, все записи, относящиеся ко времени, большему или равному 23:00, образуют новый файл. Аналогичным образом, для всех остальных часов, начиная с 01:00 до 12:00, должны быть доступны разные файлы (24 файла за 24 часа или столько, сколько когда-либо было доступно). Он должен быть динамичным.

Как этого можно легко достичь с помощью JCL?

Или это возможно только с помощью программирования Rexx или Cobol?

Включая формат ввода-вывода:

Вход :Input.data

<2016-03-31> <23:41>
data1
data2
data3
<2016-03-31> <22:41>
data1
data2
data3

Вывод:

Все записи с одинаковыми часами (ЧЧ в ЧЧ:ММ:СС) необходимо записать в файл. Таким образом, для всех часов в 24-часовом формате

Файл O/P: Output.Test.H23

<2016-03-31> <23:41>
data1
data2
data3

Выходной файл: Output.test.H22

<2016-03-31> <22:41>
data1
data2
data3

person VSai    schedule 07.04.2016    source источник
comment
Фактический формат файла   -  person VSai    schedule 07.04.2016
comment
Фактический формат файла - Timestamp   -  person VSai    schedule 07.04.2016
comment
Вы ничего не можете достичь напрямую с JCL. Вы имеете в виду с вашим продуктом SORT? Все ваши записи за один день?   -  person Bill Woodger    schedule 07.04.2016
comment
Да, записи с одного дня.   -  person VSai    schedule 08.04.2016


Ответы (1)


Чтобы получить несколько выходных наборов данных из SORT, вы используете OUTFIL. Вам нужно 24 набора данных, поэтому вам потребуется 24 OUTFIL.

Вы можете выбрать, что будет в каждом OUTFIL, используя INCLUDE= или OMIT=.

OUTFIL FNAMES=xxx01,
       INCLUDE =(start,length,CH,EQ,C'01')

24 из них, 24 имени DD в вашем JCL.

«start» и «length» — это начало часа в отметке времени и его длина (предположительно два). Измените FNAMES, измените литерал в INCLUDE=.

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

Чтобы получить информацию из «заголовка» обо всех данных, относящихся к этому заголовку, вы используете IFTHEN=(WHEN=GROUP.

Вам нужно определить начало группы, и вы должны убедиться, что начало группы не может случайно попасть в ваши данные.

OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
               BEGIN=(condition),
               PUSH=(column-to-push-to:15,2))

condition необходимо заменить допустимым логическим выражением, которое надежно идентифицирует ваш заголовок. 1,1,CH,EQ,C'‹' может быть достаточно, или вам может потребоваться объединить дополнительные отдельные условия с AND, чтобы идентифицировать ваш заголовок. У вас есть <, >, - и : для работы. Если этого недостаточно, вам потребуется дополнительный код для определения года и/или времени. Если этого недостаточно, длина записи (или наличие места для записи фиксированной длины). Если этого недостаточно, то у вас есть данные, которые выглядят как заголовок, и вы набиты.

Как насчет столбца для отправки? Это зависит от того, имеют ли ваши записи фиксированную или переменную длину.

Фиксированная длина — это просто. Вы делаете столбец для отправки номером столбца после последнего байта данных в вашей записи. Это продлит запись. Вы должны позже приспособиться к этому.

С переменной длиной сложнее, потому что вам нужно расширить запись в начале данных (иначе вы сделаете все свои записи переменной длины фиксированной длины, что бессмысленно).

INREC IFTHEN=(WHEN=INIT.
                BUILD=(1,4,2X,5)),

Это создает два байта пространства, 2X (два пробела) для каждой записи. Затем данные до конца записи копируются (все 5 отдельно) в следующую доступную колонку в BUILD, которая равна семи. Для записей переменной длины необходимо включать слово дескриптора записи в каждую BUILD, поэтому 1,4. Как только это будет сделано, любое изменение длины будет автоматически выполнено SORT.

INREC IFTHEN=(WHEN=INIT.
                BUILD=(1,4,2X,5)),
      IFTHEN=(WHEN=GROUP,
               BEGIN=(condition),
               PUSH=(5:15,2))

В 24 INCLUDE= вы тестируете два байта, которые были «вставлены» в течение часа.

В каждом OUTFIL вам необходимо вернуть записи к их исходному содержанию (без значения PUSHed). BUILD=(1,original-length) для записей фиксированной длины, BUILD=(1,4,7) для записей переменной длины, где 7 означает "от седьмого столбца до конца записи".

person Bill Woodger    schedule 08.04.2016
comment
Большое спасибо за ответ. На самом деле мой формат записи имеет заголовок Timestamp и некоторые переменные подробные записи. Мне нужно поместить запись временной метки заголовка вместе с подробными записями в файл. Аналогично нужно найти начальную позицию следующего заголовка запишите соответствующие детали в другой файл. Вот так.. это продолжается до 24. Как это можно сделать. - person VSai; 08.04.2016
comment
@Sow, вам нужно включить эту информацию в свой вопрос (используйте ссылку для редактирования под вопросом) и показать образец данных (скажем, за два разных часа) и результат, который вы ожидаете от этого. - person Bill Woodger; 09.04.2016
comment
Я добавил образец формата в описание. Пожалуйста, смотрите. - person VSai; 10.04.2016
comment
Спасибо за ответ Билл. Я использовал приведенную ниже карту сортировки для DS с фиксированным блоком, но в моем выводе получил только запись заголовка, а не подробные записи, ОПЦИЯ КОПИРОВАТЬ INREC IFTHEN=(WHEN=GROUP, BEGIN=(57,10,CH,EQ,C'Date '), PUSH=(401:15,2)) OUTFIL FNAMES=SORTOUT,INCLUDE=(68,2,FS,EQ,23),BUILD=(1400). В файл выводилась только первая запись заголовка с отметкой времени. - person VSai; 11.04.2016
comment
@Sow измените INCLUDE= на (401,2,CH,EQ,C'23'), вы смотрите только на час в заголовке, а не там, где вы его НАЖАЛИ. - person Bill Woodger; 11.04.2016
comment
@VSai, возможно, вы захотите принять это как ответ. Слева от этого ответа вы должны увидеть контур галочки. Если вы нажмете на него, он станет зеленым, я получу 15 очков репутации, вы получите два, и внимание будущих посетителей будет привлечено к этому ответу для людей с похожими требованиями. - person Bill Woodger; 11.04.2016