2

我正在尝试使用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 日期字段。

4

2 回答 2

6

最大的问题是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

所以你需要

  1. 获取原始 EBCDIC 文件的二进制传输。如果是主机上的RECFM=VB文件,先转换成RECFM=FB。
  2. 将 setFont("cp037") 添加到 IOBuilder 步骤(如果您使用的是美国 ebcdic。不同国家/地区有不同的 EBCDIC,例如德国的 cp273)。

    ICobolIOBuilder iob = CobolIoProvider.getInstance()
             .newIOBuilder(copybookName)
                 .setCopybookFileFormat(Convert.FMT_MAINFRAME)
                 .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL)
                 .setFont("cp037");
    
  3. 对于它的价值,日期看起来是 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(在英特尔硬件上)是小结尾(大型机是大端)。
  • 分区小数不同
  • 不同的浮点数(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.
于 2015-12-04T21:31:41.027 回答
1

从文档和 JRecords 似乎是如何设置的,你应该能够替换

line.getFieldValue(field).asString();

line.getFieldValue(field).asInt();

得到一些有意义的结果。如果该 int 将是 20151204 或其他完全有待观察的东西 - 但如果我正确地记得我的 COBOL 天,它可能 yyyyMMdd 只是存储为数字

于 2015-12-04T17:42:39.033 回答