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

时间:2016-04-07 18:04:04

标签: mainframe dfsort syncsort

我需要根据时间的小时将大型机数据集拆分成许多数据集。文件格式为:

<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

1 个答案:

答案 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 ;