Как определить уровень поля в тетради с помощью 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 вы можете использовать одну из служебных программ:

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 о том, как задавать вопросы.

Но в любом случае:

Использование генерации кода

  • Введите 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()
               );
            }
    
Другие вопросы по тегам