我需要根据时间的小时将大型机数据集拆分成许多数据集。文件格式为:
<Timestamp> First record
<data>Second record
<data>third record
<data>
<Timestamp>
在这里,我需要考虑时间戳,并按小时分割数据集。假设所有属于大于或等于23:00 PM的时间的记录将形成一个新文件。同样,从上午01点到下午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
答案 0 :(得分:2)
要从SORT获取多个输出数据集,请使用OUTFIL
。您需要24个数据集,因此您需要24个OUTFIL。
您可以使用INCLUDE=
或OMIT=
选择每个OUTFIL上的内容。
OUTFIL FNAMES=xxx01,
INCLUDE =(start,length,CH,EQ,C'01')
其中24个,你的JCL中有24个DD名。
&#34;开始&#34;和&#34;长度&#34;是时间戳中小时的开始,以及它的长度(大概是两个)。更改FNAMES,更改INCLUDE =。
中的文字根据您的数据质量,您可以包含第25个OUTFIL和SAVE,它可以获得至少没有出现在其他OUTFIL中的任何记录。
从&#34;标题&#34;获取信息在使用IFTHEN=(WHEN=GROUP
的所有与该标题相关的数据上。
您需要定义组的开头,并且您需要确保组的开头不会出现意外的&#34;命中&#34;在你的数据中。
OPTION COPY
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(condition),
PUSH=(column-to-push-to:15,2))
需要使用有效的逻辑表达式替换 condition
,该表达式可靠地标识您的标头。 1,1,CH,EQ,C&#39;&LT;&#39;可能已经足够,或者您可能需要将其他个别条件与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 =中,测试小时内已经&#34;推送&#34;的两个字节。
在每个OUTFIL上,您需要将记录返回到其原始内容(没有PUSHed值)。 BUILD =(1,原始长度)用于固定长度记录,BUILD =(1,4,7)用于可变长度记录,其中7是&#34;从第7列到记录结束&#34 ;