Чтение полей мэйнфрейма 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
Здесь есть запись в вики
или этот вопрос