Как определить уровень поля в тетради с помощью JRecord в Java?
Я пытаюсь прочитать файл EBCDIC и преобразовать его в формат ASCII на Java с помощью тетради. Я использую JRecord для чтения тетради. Итак, как мне получить уровень поля из тетради с помощью JRecord?
Изменить 1:
Извините за неясный вопрос. У меня нет опыта в мэйнфреймах или коболах. Я добавляю еще несколько деталей, если это могло бы помочь.
Мой исходный файл содержит несколько деталей транзакции. Тетрадь содержит информацию о транзакции и поля, относящиеся к этой конкретной транзакции.
Я должен разделить каждую транзакцию и ее поля в отдельный файл (содержащий одну транзакцию и соответствующие поля).
В прилагаемой тетради поле в строке 1 может иметь значения от строки 2 до строки 4. Если EXTRA-TYPE равен 01, тогда мне нужно прочитать поля в строке 6 до строки 11. Аналогично, если EXTRA-TYPE равен 02, затем я должен прочитать поля в строке 12 до строки 16. Я пытаюсь динамически разделить тип транзакции и соответствующие поля. (Мне нужно получить начальную и конечную позиции полей относительно типа транзакции в строке 1) Как мне добиться этого в Java?
Я ценю вашу помощь.
2 ответа
Зачем вам нужно получить уровень поля??? Для преобразования файла в ascii вам не нужен уровень поля.
Программа преобразования коммунальных услуг
Для преобразования файла Cobol в ascii вы можете использовать одну из служебных программ:
- Подпроект Cobol2Csv - преобразует файл данных Cobol в файл Csv
- Подпроект Cobol2Xml - преобразует файл данных Cobol в файл Xml
- Cobol2Json json utiltiy
Java обработка файла Cobol
Если вы хотите выполнить некоторую обработку файла, вы можете использовать функцию Generate RecordEditor для генерации примера кода JRecord из тетради Cobol.
Код сгенерированный стандартным шаблоном
Если вы используете стандартный шаблон, 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
Прочитайте http://www.catb.org/~esr/faqs/smart-questions.html или https://www.mikeash.com/getting_answers.html о том, как задавать вопросы.
Но в любом случае:
Использование генерации кода
Загрузите Recordeditor со https://sourceforge.net/projects/record-editor/files/Test/Version_0.98.3/ Не нужно устанавливать версию USB - просто разархивируйте ее
Запустите RecordEditor и выберите опцию генерации
- Введите Cobol Copybook, образец файла cobol (если он у вас есть).Вероятно, вы сможете использовать опцию " Разделить тетрадь при переопределении"
- На панели " Записи" введите DA147-EXTRA-TYPE в поле " Тип записи".
- Нажмите кнопку " Создать код". На следующем экране вы можете выбрать шаблон. Стандартный шаблон является хорошей отправной точкой
Нажмите кнопку " Создать код", программа должна сгенерировать пример кода, например:
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() ); }