0

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

编辑1:

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

我的源文件包含多个交易细节。字帖包含有关交易的信息以及与该特定交易相关的字段。

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

抄写本

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

我感谢您的帮助。

4

2 回答 2

1

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


实用程序转换程序

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

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

Cobol 文件的 Java 处理

如果要对 File 进行一些处理,可以使用RecordEditor的Generate 功能从 Cobol copybook生成示例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子项目的代码。它tree通过扩展CobolSchemaReader进行处理

于 2017-08-06T08:02:33.947 回答
0

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

但不管怎么说:

使用代码生成

在此处输入图像描述

  • 输入 Cobol Copybook,示例 cobol 文件(如果有的话)。您 可能可以使用“重新定义时拆分文案 ”选项

在此处输入图像描述

  • Records面板上的Record Type字段中输入DA147-EXTRA-TYPE

在此处输入图像描述

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

在此处输入图像描述

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

        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()
               );
            }
    
于 2017-08-08T01:26:53.780 回答