我正在尝试阅读一个EBCDIC文件,并借助于copybook将其转换为Java格式的ASCII格式。我正在使用JRecord来阅读本书。那么现在,我如何使用JRecord从字帖中获取字段级别?
编辑1:
请原谅我一个模糊的问题。我没有大型机或cobol的经验。如果可能有帮助,我会添加更多细节。
我的源文件包含多个交易详情。本抄写本包含有关交易的信息以及与该特定交易相关的字段。
我必须将每个事务及其字段拆分为一个单独的文件(包含一个事务和相应的字段)。
在附加的字帖中,第1行的字段可以包含第2行到第4行的值。如果EXTRA-TYPE是01,那么我必须读取第6行到第11行的字段。同样,如果是EXTRA-TYPE是02,然后我必须读取第12行到第16行的字段。 我试图动态拆分事务类型及其各自的字段。 (我需要在第1行中获取与事务类型相关的字段的开始和结束位置)如何在Java中实现此目的?
感谢您的帮助。
答案 0 :(得分:1)
为什么你需要获得Field Level?要将文件转换为ascii,您不需要字段级别。
要将 Cobol 文件转换为 ascii ,您可以使用其中一个实用程序:
如果您想对文件进行一些处理,可以使用生成 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();
}
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();
}
如果您想进行更多通用处理,可以使用 fieldIterator :
FieldIterator fieldIterator = line.getFieldIterator("Record-Name");
在最新版本的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.html或https://www.mikeash.com/getting_answers.html
但无论如何:
从https://sourceforge.net/projects/record-editor/files/Test/Version_0.98.3/下载Recordeditor,不需要安装USB版本 - 只需解压缩
启动RecordEditor并选择生成选项
按生成代码按钮,该程序应生成一些示例代码,如:
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()
);
}