MAINFRAME:在 JCL 中排序以将数据集转换为 CSV 格式

Posted

技术标签:

【中文标题】MAINFRAME:在 JCL 中排序以将数据集转换为 CSV 格式【英文标题】:MAINFRAME: SORT in JCL to convert a dataset into CSV format 【发布时间】:2017-11-15 14:36:49 【问题描述】:

希望你没事。我有一个问题,如果可能的话,我需要你的帮助。

我正在使用大型机 JCL,并且我有一个包含记录的数据集;每条记录都有不同的固定列,用“~”分隔(我们使用它是因为在 NAME 列中,名称用逗号分隔)。我需要将该数据集转换为 CSV 文件格式,因此它必须是: 1) 用逗号分隔 2) 使用可变长度而不是固定长度 3)我不需要所有的列,只需要其中的 4 个(并且与原始的顺序不同) 4)第一列必须不同 5) 如果名字有 , (Ex: LAST NAME, NAME) 使用 " "

这是一个输入文件的例子:

ROLENAME~LID     ~NAME                  ~NONCNCL~ACCDATE ~SUSPEND
CARINQ  ~X       ~*** NOT FOUND ***     ~       ~        ~       
CARONL  ~AZBLCH  ~*** NOT FOUND ***     ~       ~        ~       
SOTHER  ~BZBWD4  ~SUAREZ, VICTOR        ~N      ~10/01/17~N      
CARONL  ~BZCJHS  ~CHURCH DAVID S        ~N      ~11/10/17~N      
CARONL  ~VZC2G1  ~*** NOT FOUND ***     ~       ~        ~       
CARONL  ~BZDKKF  ~PLAARDRTE ALLY        ~N      ~11/13/17~N      
SOTHER  ~HZDFGH  ~*** NOT FOUND ***     ~       ~        ~       
CARONL  ~JZFPOI  ~LOPEZ KAREN N         ~N      ~11/10/17~N      
CARONL  ~IZG0WZ  ~FOSHIL, RICHARD       ~N      ~11/13/17~N      
SOTHER  ~OZG3T2  ~CARLINE KECHUA        ~N      ~11/13/17~N      
CARONL  ~PZMMNB  ~BARELTINE, DUANE      ~N      ~11/13/17~N      
CARONL  ~PZNSWX  ~*** NOT FOUND ***     ~       ~        ~       
CARONL  ~RZPF5V  ~SLIMMORE JACK         ~N      ~10/12/17~N

这是一个输出文件的例子:

GMID,Name,Last Login Date,Role/Group 
X,*** NOT FOUND ***,,CARINQ
AZBLCH,*** NOT FOUND ***,,CARONL
BZBWD4,"SUAREZ, VICTOR",10/01/17,SOTHER
BZCJHS,CHURCH DAVID S,11/10/17,CARONL
VZC2G1,*** NOT FOUND ***,,CARONL
BZDKKF,PLAARDRTE ALLY,11/13/17,CARONL
HZDFGH,*** NOT FOUND ***,,SOTHER
JZFPOI,LOPEZ KAREN N,11/10/17,CARONL
IZG0WZ,"FOSHIL, RICHARD",11/13/17,CARONL
OZG3T2,CARLINE KECHUA,11/13/17,SOTHER
PZMMNB,"BARELTINE, DUANE",11/13/17,CARONL
PZNSWX,*** NOT FOUND ***,,CARONL
RZPF5V,SLIMMORE JACK,10/12/17,CARONL

我正在尝试使用程序 SORT 来使用 INREC PARSE 和 BUILD,但我无法完全理解它,尤其是制作字段变量而不是修复长度并更改列的名称,无论如何我都可以连接以后如有必要,没什么大不了的(我想避免使用 EasyTrieve,因为我不太熟悉它)。 有人有这方面的例子吗?我使用 SORT 查找了类似的案例,但没有找到。我可以创建报告,但只能使用固定列,我找不到可变长度的方法

对于冗长的文字,我很抱歉,但我想尽可能清楚。 非常感谢您! 祝您早日愉快!

【问题讨论】:

【参考方案1】:

如果不担心header,可以使用:

OPTION COPY                              
INREC IFTHEN=(WHEN=INIT,BUILD=(1,15,31,15,46,15,SQZ=(SHIFT=LEFT))),      
      IFTHEN=(WHEN=INIT,FINDREP=(IN=C'~',OUT=C',')) 

我假设 LRECL 为 80,还假设您只需要从第 1、31 和 46 列开始的 3 列,每列 15 个字节。

.

【讨论】:

谢谢!这并没有完全按原样工作,但它给了我一些解决一些错误的想法。 @Jorge 如果答案有用,请考虑投票 我做到了....但它说我没有足够的声誉来表明:(

以上是关于MAINFRAME:在 JCL 中排序以将数据集转换为 CSV 格式的主要内容,如果未能解决你的问题,请参考以下文章

JCL 在一行中合并记录

在 Mainframe 中发送电子邮件的不同方式都有哪些?

如何仅将输入文件的选定列复制到jcl排序中的输出文件

使用 JCL 排序在 x 条记录后写入字符

使用 JCL 排序删除特定记录类型的重复项

将JDBC ResultSet结果集转成List