基于标头拆分大型机数据集



我需要根据时间将一个大型机数据集拆分为多个数据集。文件格式为:

<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是"从第七列到记录末尾"。

最新更新