jav*_*ean 2 java cobol date mainframe jrecord
我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
当我按上面解析输出时
MPOH-ENTRY-DATE : 11261a1
MPOH-STATUS-DATE : 11261a1
MPOH-APPROVED-DATE : 11261a1
MPOH-ORDER-DATE : 11266140
Run Code Online (Sandbox Code Playgroud)
请帮我将这些字段转换为Java Date字段.
最大的问题是有一个EBCDIC到ascii转换.
JRecord构建器创建
ICobolIOBuilder iob = CobolIoProvider.getInstance()
             .newIOBuilder(copybookName)
                 .setCopybookFileFormat(Convert.FMT_OPEN_COBOL)
                 .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL);
Run Code Online (Sandbox Code Playgroud)
不包括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
Run Code Online (Sandbox Code Playgroud)
MPOH-ORDER-DATE现在是x'11 26 61 40',而EBCDIC原件可能是x'11 50 81 7c'即
CYY = 115 (or 2015)
 MM =  08 
 DD =  17
Run Code Online (Sandbox Code Playgroud)
所以你需要
将setFont("cp037")添加到IOBuilder步骤(如果您使用的是US ebcdic.不同国家/地区有不同的EBCDIC,例如德国的cp273).
ICobolIOBuilder iob = CobolIoProvider.getInstance()
         .newIOBuilder(copybookName)
             .setCopybookFileFormat(Convert.FMT_MAINFRAME)
             .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL)
             .setFont("cp037");
Run Code Online (Sandbox Code Playgroud)值得一提的是,日期看起来是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
Run Code Online (Sandbox Code Playgroud)
但它看起来不像日期???
Convert.FMT_MAINFRAME和Convert.FMT_OPEN_COBOL之间没有太大区别.但这些是差异:
以下字段是您可以看到差异的地方:
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.
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1951 次  |  
        
|   最近记录:  |