我需要根据时间将一个大型机数据集拆分为多个数据集。文件格式为:
<Timestamp> First record
<data>Second record
<data>third record
<data>
<Timestamp>
在这里,我需要考虑时间戳,并按小时划分数据集。假设所有属于大于或等于23:00 PM的时间的记录将形成一个新文件。类似地,对于从凌晨1点到下午12点的所有其他时间,需要提供不同的文件(24小时24个文件或可用的文件数量)。它需要是动态的。
如何通过JCL轻松实现这一点?
还是只能通过Rexx或Cobol编程实现?
包括I/O格式:
输入:Input.data
<2016-03-31> <23:41>
data1
data2
data3
<2016-03-31> <22:41>
data1
data2
data3
输出:
所有具有相同小时数(HH:MM:SS中的HH)的记录都需要写入一个文件。这种方式适用于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
要从SORT获得多个输出数据集,请使用OUTFIL
。您需要24个数据集,因此需要24个OUTFIL。
您可以使用INCLUDE=
或OMIT=
选择每个OUTFIL上的内容。
OUTFIL FNAMES=xxx01,
INCLUDE =(start,length,CH,EQ,C'01')
其中24个,JCL中的24个DD名称。
"start"one_answers"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(两个空格)。然后,记录末尾的数据被复制到BUILD中的下一个可用列,即7。对于可变长度的记录,要求在每个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是"从第七列到记录末尾"。