我正在尝试读取大型机文件,但是除了comp 3文件之外所有文件都在工作。下面的程序给出了奇怪的值。它无法读取两倍的薪水值,也给出了2020202020.20的值。我不知道缺少什么。请帮助我找到它。

程序:

public final class Readcopybook {

    private String dataFile = "EMPFILE.txt";
    private String copybookName = "EMPCOPYBOOK.txt";

    public Readcopybook() {
        super();
        AbstractLine line;

        try {
            ICobolIOBuilder iob = JRecordInterface1.COBOL.newIOBuilder(copybookName)
                    .setFileOrganization(Constants.IO_BINARY_IBM_4680).setSplitCopybook(CopybookLoader.SPLIT_NONE);

            AbstractLineReader reader = iob.newReader(dataFile);
            while ((line = reader.read()) != null) {
                System.out.println(line.getFieldValue("EMP-NO").asString() + " "
                        + line.getFieldValue("EMP-NAME").asString() + " "
                        + line.getFieldValue("EMP-ADDRESS").asString() + " "
                        + line.getFieldValue("EMP-SALARY").asString() + " "
                        + line.getFieldValue("EMP-ZIPCODE").asString());
            }

            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Readcopybook();
    }
}


环保手册:

001700 01 EMP-RECORD.
001900        10  EMP-NO                     PIC 9(10).
002000        10  EMP-NAME                   PIC X(30).
002100        10  EMP-ADDRESS                PIC X(30).
002200        10  EMP-SALARY                 PIC S9(8)V9(2) COMP-3.
002200        10  EMP-ZIPCODE                PIC 9(4).


EMPFILE:

0000001001suneel kumar r                bangalore                       e¡5671
0000001002JOSEPH                        WHITE FIELD                     rrn4500


输出:

1001 suneel kumar r bangalore 20200165a10 5671
   2020202020.20
   2020202020.20
   2020202020.20
   2020202020.20
   2020202020.20
   2020202020.20
   2020202020.20
   2020202020.20

  0.00
1002 JOSEPH WHITE FIELD 202072726e0 4500

最佳答案

一个问题是您对文件执行了Ebcdic到Ascii的转换。
2020年...是一个死人放弃x'20'是ASCII空间字符。
This Answer处理从Ebcdic到ascii的转换问题。

您需要从大型机进行二进制传输,并使用Ebcdic读取文件。您将需要在主机上检查RECFM。如果RECFM是


FB-问题只是转移
VB-转换为大型机上的FB,在传输中包括RDW(记录描述符字)选项。
其他-在大型机上转换为FB / VB




更新了Java代码

int fileOrg = Constants.IO_FIXED_LENGTH_RECORDS; // or Constants.IO_VB
ICobolIOBuilder iob = JRecordInterface1.COBOL
        .newIOBuilder(copybookName)
             .setFileOrganization(fileOrg)
             .setFont("Cp037")
             .setSplitCopybook(CopybookLoader.SPLIT_NONE);




注:IO_BINARY_IBM_4680用于IBM 4690 Registers



有一个Wiki条目here

或这个问题

How do you generate java~jrecord code fror a Cobol copybook

08-05 19:40