Разделение наборов данных мэйнфреймов на основе заголовка
Мне нужно разбить набор данных мэйнфрейма на множество наборов данных в зависимости от часа времени. Формат файла:
<Timestamp> First record
<data>Second record
<data>third record
<data>
<Timestamp>
Здесь я должен принять во внимание временную отметку и разделить набор данных по часам. Скажем, все записи, относящиеся ко времени, большему или равному 23:00, сформируют новый файл. Аналогично для всех остальных часов, начиная с 01:00 до 12:00, должны быть доступны разные файлы (24 файла за 24 часа или сколько их будет доступно). Это должно быть динамичным.
Как это может быть легко достигнуто с помощью JCL?
Или это возможно только через Rexx или Cobol?
Включая формат ввода / вывода:
Input: 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
1 ответ
Чтобы получить несколько выходных данных из SORT, вы используете OUTFIL
, Вы хотите 24 набора данных, поэтому вам нужно 24 OUTFILs.
Вы можете выбрать, что происходит на каждом OUTFIL, используя INCLUDE=
или же OMIT=
,
OUTFIL FNAMES=xxx01,
INCLUDE =(start,length,CH,EQ,C'01')
24 из них, 24 DDnames в вашем 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, оригинальная длина) для записей фиксированной длины, BUILD=(1,4,7) для записей переменной длины, где 7 - это "от столбца семь до конца записи".