一个大问题是需要进行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
所以您需要进行以下操作:
- A binary transfer to Get the raw EBCDIC file. If it is a RECFM=VB file on the mainframe, convert it to RECFM=FB first.
Add setFont("cp037") to the IOBuilder step (if you are using US ebcdic. There are different EBCDIC's for different countries e.g. cp273 for germany) .
ICobolIOBuilder iob = CobolIoProvider.getInstance()
.newIOBuilder(copybookName)
.setCopybookFileFormat(Convert.FMT_MAINFRAME)
.setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL)
.setFont("cp037");
For what it worth, the Dates look to be in a CYYMMDD format where C=0 is 1900 and C=1 is 2000
如果我不正确,请提供原始数据和复印本。
另一种选择是复印本位移的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是小端序的(主机是大端序的)。
- 数字以区域码方式存储的方法不同。
- 浮点数不同(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.
asInt()
而不是asString()
来获取值。 - Jan