Чтение полей мэйнфрейма comp-3 с использованием JRecord

Я пытаюсь прочитать файл мэйнфрейма, но все работают, кроме файла comp 3. Ниже программа выдаёт странные значения. Она не может прочитать значение зарплаты, которое в два раза больше, и дает значения 2020202020.20. Я не знаю, чего не хватает. Пожалуйста, помогите мне найти это.

Программа:

public final class Readcopybook {

    private String dataFile = "EMPFILE.txt";
    private String copybookName = "EMPCOPYBOOK.txt";

    public Readcopybook() {
        super();
        AbstractLine line;

        try {
            ICobolIOBuilder iob = JRecordInterface1.COBOL.newIOBuilder(copybookName)
                    .setFileOrganization(Constants.IO_BINARY_IBM_4680).setSplitCopybook(CopybookLoader.SPLIT_NONE);

            AbstractLineReader reader = iob.newReader(dataFile);
            while ((line = reader.read()) != null) {                
                System.out.println(line.getFieldValue("EMP-NO").asString() + " "
                        + line.getFieldValue("EMP-NAME").asString() + " " 
                        + line.getFieldValue("EMP-ADDRESS").asString() + " " 
                        + line.getFieldValue("EMP-SALARY").asString() + " "
                        + line.getFieldValue("EMP-ZIPCODE").asString());
            }

            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Readcopybook();
    }
}

EMPCOPYBOOK:

001700 01 EMP-RECORD.                                                           
001900        10  EMP-NO                     PIC 9(10).                         
002000        10  EMP-NAME                   PIC X(30).                         
002100        10  EMP-ADDRESS                PIC X(30).                         
002200        10  EMP-SALARY                 PIC S9(8)V9(2) COMP-3.             
002200        10  EMP-ZIPCODE                PIC 9(4).                          

EMPFILE:

0000001001suneel kumar r                bangalore                       e¡5671                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
0000001002JOSEPH                        WHITE FIELD                     rrn4500

Выход:

1001 suneel kumar r bangalore 20200165a10 5671
   2020202020.20 
   2020202020.20 
   2020202020.20 
   2020202020.20 
   2020202020.20 
   2020202020.20 
   2020202020.20 
   2020202020.20 

  0.00 
1002 JOSEPH WHITE FIELD 202072726e0 4500

1 ответ

Одна проблема заключается в том, что вы выполнили преобразование Ebcdic в Ascii для файла. 2020... мертвый дар x'20'- космический персонаж. В этом ответе рассматриваются проблемы с преобразованием Ebcdic в ascii.

Вам необходимо выполнить двоичный перенос с мэйнфрейма и прочитать файл с помощью Ebcdic. Вам нужно будет проверить RECFM на мэйнфрейме. Если RECFM

  • FB - проблемы просто перенести
  • VB - либо преобразовать в FB на мэйнфрейме, либо включить в передачу опцию RDW (Слово дескриптора записи).
  • Другое - преобразование в FB/VB на мэйнфрейме

Обновленный код Java

int fileOrg = Constants.IO_FIXED_LENGTH_RECORDS; // or Constants.IO_VB
ICobolIOBuilder iob = JRecordInterface1.COBOL
        .newIOBuilder(copybookName)
             .setFileOrganization(fileOrg)
             .setFont("Cp037") 
             .setSplitCopybook(CopybookLoader.SPLIT_NONE);

Примечание: IO_BINARY_IBM_4680 для регистров IBM 4690


Здесь есть запись в вики

или этот вопрос

Как вы генерируете код java~jrecord для Cobol copybook

Другие вопросы по тегам