如何使用Java中的JRecord识别副本中字段的级别?

时间:2017-08-06 06:15:30

标签: java cobol ebcdic copybook jrecord

我正在尝试阅读一个EBCDIC文件,并借助于copybook将其转换为Java格式的ASCII格式。我正在使用JRecord来阅读本书。那么现在,我如何使用JRecord从字帖中获取字段级别?

编辑1:

请原谅我一个模糊的问题。我没有大型机或cobol的经验。如果可能有帮助,我会添加更多细节。

我的源文件包含多个交易详情。本抄写本包含有关交易的信息以及与该特定交易相关的字段。

我必须将每个事务及其字段拆分为一个单独的文件(包含一个事务和相应的字段)。

CopyBook

在附加的字帖中,第1行的字段可以包含第2行到第4行的值。如果EXTRA-TYPE是01,那么我必须读取第6行到第11行的字段。同样,如果是EXTRA-TYPE是02,然后我必须读取第12行到第16行的字段。 我试图动态拆分事务类型及其各自的字段。 (我需要在第1行中获取与事务类型相关的字段的开始和结束位置)如何在Java中实现此目的?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

为什么你需要获得Field Level?要将文件转换为ascii,您不需要字段级别。

效用转换计划

要将 Cobol 文件转换为 ascii ,您可以使用其中一个实用程序:

  • Cobol2Csv子项目 - 将Cobol数据文件转换为Csv文件
  • Cobol2Xml子项目 - 将Cobol数据文件转换为Xml文件
  • Cobol2Json json utiltiy

Cobol文件的Java处理

如果您想对文件进行一些处理,可以使用生成 RecordEditor的功能,用于从Cobol副本中生成样本JRecord代码。

使用标准模板生成的代码

如果您使用标准模板,RecordEditor将生成以下代码:

    AbstractLine line;
    int lineNum = 0;

    try {
        ICobolIOBuilder iob = JRecordInterface1.COBOL
                                   .newIOBuilder(copybookName)
                                       .setFont("cp037")
                                       .setFileOrganization(Constants.IO_FIXED_LENGTH)
                                       .setSplitCopybook(CopybookLoader.SPLIT_NONE)
                                   ;  


        FieldNamesDtar020.RecordDtar020 rDtar020 = FieldNamesDtar020.RECORD_DTAR020;
        AbstractLineReader reader = iob.newReader(dataFile);
        while ((line = reader.read()) != null) {
            lineNum += 1;
            System.out.println(
                          line.getFieldValue(rDtar020.keycodeNo).asString()
                  + " " + line.getFieldValue(rDtar020.storeNo).asString()
                  + " " + line.getFieldValue(rDtar020.date).asString()
                  + " " + line.getFieldValue(rDtar020.deptNo).asString()
                  + " " + line.getFieldValue(rDtar020.qtySold).asString()
                  + " " + line.getFieldValue(rDtar020.salePrice).asString()
               );
        }

        reader.close();
    } catch (Exception e) {
        System.out.println("~~> " + lineNum + " " + e);
        System.out.println();

        e.printStackTrace();
    }

使用lineWrapper模板生成的代码

  AbstractLine line;
    int lineNum = 0;

    try {
        ICobolIOBuilder iob = JRecordInterface1.COBOL
                                   .newIOBuilder(copybookName)
                                       .setFont("cp037")
                                       .setFileOrganization(Constants.IO_FIXED_LENGTH)
                                       .setSplitCopybook(CopybookLoader.SPLIT_NONE)
                                   ;  


       LineDtar020JR lineDtar020JR = new LineDtar020JR();


       AbstractLineReader reader = iob.newReader(dataFile);
       while ((line = reader.read()) != null) {
           lineNum += 1;
           lineDtar020JR.setLine(line);
           System.out.println(
                          lineDtar020JR.getKeycodeNo() 
                  + " " + lineDtar020JR.getStoreNo() 
                  + " " + lineDtar020JR.getDate() 
                  + " " + lineDtar020JR.getDeptNo() 
                  + " " + lineDtar020JR.getQtySold() 
                  + " " + lineDtar020JR.getSalePrice() 
               );
        }

        reader.close();
    } catch (Exception e) {
        System.out.println("~~> " + lineNum + " " + e);
        System.out.println();

        e.printStackTrace();
    }

通用Cobol处理

如果您想进行更多通用处理,可以使用 fieldIterator

FieldIterator fieldIterator = line.getFieldIterator("Record-Name");

JRecord示例

在最新版本的JRecord 0.81.4 中, Source / JRecord_IO_Builder_Examples / src 目录中有一些示例

树处理

如果您需要使用JRecord访问级别编号,请使用 CobolSchemaReader.newCobolSchemaReader(...)界面。

您还可以查看Cobol2Xml子项目的代码。它通过扩展 CobolSchemaReader

进行tree处理

答案 1 :(得分:0)

阅读 关于提问的问题http://www.catb.org/~esr/faqs/smart-questions.htmlhttps://www.mikeash.com/getting_answers.html

但无论如何:

使用代码生成

enter image description here

  • 输入Cobol Copybook,示例cobol文件(如果你有一个)。你会 可能能够使用拆分字帖 重新定义选项

enter image description here

  • 记录面板上,在记录类型字段中输入 DA147-EXTRA-TYPE

enter image description here

  • 生成代码按钮。在下一个屏幕上,您可以选择模板标准模板是一个很好的起点

enter image description here

  • 生成代码按钮,该程序应生成一些示例代码,如:

        ICobolIOBuilder iob = JRecordInterface1.COBOL
                                   .newIOBuilder(copybookName)
                                       .setFileOrganization(Constants.IO_BIN_TEXT)
                                       .setSplitCopybook(CopybookLoader.SPLIT_REDEFINE)
                                   ;  
    
    
        FieldNamesAmspodownloadRedef1.RecordPoHeaderRecord rPoHeaderRecord = FieldNamesAmspodownloadRedef1.RECORD_PO_HEADER_RECORD;
        FieldNamesAmspodownloadRedef1.RecordProductRecord rProductRecord = FieldNamesAmspodownloadRedef1.RECORD_PRODUCT_RECORD;
        FieldNamesAmspodownloadRedef1.RecordLocationRecord rLocationRecord = FieldNamesAmspodownloadRedef1.RECORD_LOCATION_RECORD;
        AbstractLineReader reader = iob.newReader(dataFile);
        while ((line = reader.read()) != null) {
            lineNum += 1;
            if (
               "H1".equals(line.getFieldValue(rPoHeaderRecord.recordType).asString())
            )  {
    
               System.out.println(
                          line.getFieldValue(rPoHeaderRecord.recordType).asString()
                  + " " + line.getFieldValue(rPoHeaderRecord.sequenceNumber).asString()
                  + " " + line.getFieldValue(rPoHeaderRecord.vendor).asString()
                  + " " + line.getFieldValue(rPoHeaderRecord.po).asString()
                    ....
                  + " " + line.getFieldValue(rPoHeaderRecord.cancelByDate).asString()
                  + " " + line.getFieldValue(rPoHeaderRecord.ediType).asString()
               );
            }
            if (
               "D1".equals(line.getFieldValue(rProductRecord.recordType).asString())
            )  {
    
               System.out.println(
                          line.getFieldValue(rProductRecord.recordType).asString()
                  + " " + line.getFieldValue(rProductRecord.packQty).asString()
                  + " " + line.getFieldValue(rProductRecord.packCost).asString()
                  + " " + line.getFieldValue(rProductRecord.apn).asString()
                  + " " + 
                      .....
                  + " " + line.getFieldValue(rProductRecord.productName).asString()
               );
            }
            if (
               "S1".equals(line.getFieldValue(rLocationRecord.recordType).asString())
            )  {
    
               System.out.println(
                          line.getFieldValue(rLocationRecord.recordType).asString()
                  + " " + line.getFieldValue(rLocationRecord.dcNumbe.get(0)).asString()
                  + " " + line.getFieldValue(rLocationRecord.packQuantit.get(0)).asString()
               );
            }