我正在尝试使用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字段.
最大的问题是有一个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.