使用Java

时间:2017-08-08 11:47:01

标签: ascii mainframe ebcdic packed-decimal

我有一个带有一些COMP-3编码字段的文件。有人可以告诉我如何在下面的帖子中测试这段代码吗?

How to unpack COMP-3 digits using Java?

我试过的代码是

BufferedReader br = new BufferedReader(new FileReader(FILENAME))){

    String sCurrentLine;
    int i=0;
    String bf =null;
    while ((sCurrentLine = br.readLine()) != null) {
        i++;
        System.out.println("FROM BYTES ");
            System.out.println(unpackData(sCurrentLine.getBytes(), 5));

        for (int j = 0; j < sCurrentLine.length(); j++) {
            char c = sCurrentLine.charAt(j);
            bf =bf + (int)c;
        }

以上代码未给出正确的结果。 我试过单列转换,但它没有返回正确的结果。 我的输入栏目 enter image description here

输入文件看起来像

enter image description here

我试过JRecord传递cbl copybook和数据文件,它生成的Java Code给出了不一样的结果  生成输出 enter image description here

必需的输出

enter image description here

cbl copy book看起来像下面的图像

enter image description here

3 个答案:

答案 0 :(得分:0)

如果使用基于 Cobol Ascii How to unpack COMP-3 digits using Java?中已接受的答案可能。使用FileReader读取 Mainframe Ebcdic 文件时,它将无法使用。

您已将问题标记为大型机 - Ebcdic

要正确处理,

  1. 从大型机进行二进制传输(或在大型机上运行)。 不要执行ascii转换,这会破坏comp-3字段。
  2. 将文件作为流读取并将其作为字节处理。
  3. COMP-3 data unpacking in Java (Embedded in Pentaho)中的答案将有效; stackoverflow上还有其他答案也可以使用。

    尝试处理Comp-3数据时,角色容易出错

    JRecord

    如果您有Cobol副本,JRecord library将允许您使用Cobol副本阅读该文件。它包含一个文档ReadMe_NewUsers.html,它涵盖了基础知识。

    RecordEditor

    生成&gt;&gt;&gt; RecordEditor的cobol 菜单选项的Java~JRecord代码将从Cobol副本(以及可选的数据文件)生成Java~JRecord。 enter image description here

    有关在此回答How do I identify the level of a field in copybook using JRecord in Java?中生成代码或查看here

    的详细信息

    同样在RecordEditor 记录布局&gt;&gt;&gt;加载Cobol Copybook 将加载Cobol副本;然后,您可以使用Layout查看文件。

答案 1 :(得分:0)

操纵压缩十进制的最佳方法是使用IBM Data Access Accelerator API。它使用名为packed objects的IBM特定JVM优化,这是一种有效处理本机数据的技术。 SO上有一些很好的Java代码用于处理压缩十进制数据,但数据访问加速器是明智的选择。它吹掉了RYO代码。

答案 2 :(得分:0)

如果比较副本与数据;你会发现它不匹配。

特别是 Class-Order-edg 定义为pic 9(3),但它看起来像文件中的二进制

Bils-count-edg看起来要移6个字节。 这与字段Class-order-edg - &gt;一致。 Country-no-edg被改为comp-3 / comp。该字帖似乎已过时。