当前位置:  开发笔记 > 编程语言 > 正文

如何从COBOL中的COMP-3字段读取Java中的日期?

如何解决《如何从COBOL中的COMP-3字段读取Java中的日期?》经验,为你挑选了1个好方法。

我正在尝试使用JRecord读取COBOL数据文件,因为我有一个Header记录和Detail记录,因此我使用SPLIT_01_LEVEL和CopyBook文件格式解析为FMT_OPEN_COBOL.我在平面文件中有几个日期字段作为COMP-3字段,我无法理解如何将它们转换为Java日期字段.

ICobolIOBuilder iob = CobolIoProvider.getInstance()
                 .newIOBuilder(copybookName)
                     .setCopybookFileFormat(Convert.FMT_OPEN_COBOL)
                     .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL);
//I fetched fields as below
line.getFieldValue(field).asString();

CopyBook的字段为

MPOH-ENTRY-DATE              PIC S9(7) COMP-3.
MPOH-STATUS-DATE             PIC S9(7) COMP-3.
MPOH-APPROVED-DATE           PIC S9(7) COMP-3.
MPOH-ORDER-DATE              PIC S9(7) COMP-3.

当我按上面解析输出时

MPOH-ENTRY-DATE : 11261a1
MPOH-STATUS-DATE : 11261a1
MPOH-APPROVED-DATE : 11261a1
MPOH-ORDER-DATE : 11266140

请帮我将这些字段转换为Java Date字段.



1> Bruce Martin..:

最大的问题是有一个EBCDIC到ascii转换.

JRecord构建器创建

ICobolIOBuilder iob = CobolIoProvider.getInstance()
             .newIOBuilder(copybookName)
                 .setCopybookFileFormat(Convert.FMT_OPEN_COBOL)
                 .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL);

不包括setFont,因此在Unix/Linux/Windows PC上,这表示该文件是ASCII.如果你在Window/Linux/Unix上运行并且文件是在大型机上创建的,那么这是不好的,同样是数据真的来自GNUCobol ???.

数据看起来是通过EBCDIC - > Ascii转换??? 或者可能移动1个字节.如果它真的是GNU_Cobol你可能需要其他格式之一,例如FMT_OPEN_COBOL_MVS


以下所有4个数字都不是有效的comp-3数字:

MPOH-ENTRY-DATE : 11261a1
MPOH-STATUS-DATE : 11261a1
MPOH-APPROVED-DATE : 11261a1
MPOH-ORDER-DATE : 11266140

MPOH-ORDER-DATE现在是x'11 26 61 40',而EBCDIC原件可能是x'11 50 81 7c'即

CYY = 115 (or 2015)
 MM =  08 
 DD =  17

所以你需要

    二进制传输以获取原始EBCDIC文件.如果它是主机上的RECFM = VB文件,请先将其转换为RECFM = FB.

    将setFont("cp037")添加到IOBuilder步骤(如果您使用的是US ebcdic.不同国家/地区有不同的EBCDIC,例如德国的cp273).

    ICobolIOBuilder iob = CobolIoProvider.getInstance()
             .newIOBuilder(copybookName)
                 .setCopybookFileFormat(Convert.FMT_MAINFRAME)
                 .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL)
                 .setFont("cp037");
    

    值得一提的是,日期看起来是CYYMMDD格式,其中C = 0是1900而C = 1是2000


如果我不对,请提供原始数据和Copybook

另一种选择是字帖位移中的1字节错误

例如

MPOH-ENTRY-DATE : 1?11261
MPOH-STATUS-DATE : 1?11261
MPOH-APPROVED-DATE : 1?11261
MPOH-ORDER-DATE : 112661

但它看起来不像日期???


Convert.FMT_MAINFRAME和Convert.FMT_OPEN_COBOL之间没有太大区别.但这些是差异:

GNU Cobol有1,2,4,8字节的二进制整数,而主机有2,4,8

GNU-Cobol中的Comp-5(在intel硬件上)是小结局(大型机是big-endian).

分区十进制是不同的

不同的浮点数(comp-1,comp-2).

以下字段是您可以看到差异的地方:

03 f1              pic s9(3).
03 f2              pic s99 comp.
03 f3              pic s9(4) comp-5  
03 f4     comp-1.
03 f5     comp-2.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有