gpt4 book ai didi

java - 如何使用 Java 中的 JRecord 识别抄写本中字段的级别?

转载 作者:行者123 更新时间:2023-12-02 12:25:16 29 4
gpt4 key购买 nike

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

编辑1:

请原谅我问一个模糊的问题。我没有大型机或 cobol 方面的经验。如果有帮助的话,我将添加更多详细信息。

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

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

CopyBook

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

感谢您的帮助。

最佳答案

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

<小时/>

实用程序转换程序

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

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

Cobol 文件的 Java 处理

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

使用标准模板生成的代码

如果您使用标准模板,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 示例

在最新版本的JRecord0.81.4 Source/JRecord_IO_Builder_Examples/src 目录中有示例

<小时/>

树处理

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

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

关于java - 如何使用 Java 中的 JRecord 识别抄写本中字段的级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529152/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com