Поместите десятичную точку в правильное положение при разборе данных по дескриптору cobol
Я пытаюсь проанализировать данные из файла TXT дескриптором Cobol в Java. Что-то не так, когда я использую этот метод:
Record net.sf.cb2java.copybook.Copybook.parseData(byte[] arg0).
В дескрипторе cobol есть строка:
20 ACCD-LONG-SECONDS PIC 99V9999.
В этом случае соответствующий результат должен содержать 2 цифры слева от десятичной точки и 4 цифры справа от десятичной точки. Но я получил 6 цифр справа от десятичной точки. Например, если данные в исходном файле 123456, мы ожидаем 12,3456, однако получим 0,113456.
Может ли кто-нибудь помочь мне отсюда?
2 ответа
На мой взгляд, ваш интерфейсный файл определен неправильно. Файл "COBOL" должен содержать только текстовые данные. Если подписано, должен быть фактический +/-, если с десятичными знаками, фактическая десятичная точка. В качестве альтернативы для десятичных знаков возможен "коэффициент масштабирования", который необходим для текстового представления данных с плавающей запятой.
У вас есть "подразумеваемая" десятичная точка. Кажется, что метод, который вы используете, не понимает это правильно. Если он дает вам.123456, то он просто не работает. Если он не работает для подразумеваемого десятичного знака, он также может не работать для других определений.
Безопаснее всего было бы переключать методы. Следующий безопасный способ - исправить метод, который вы используете. Следующий самый безопасный способ состоит в том, чтобы при получении результата самостоятельно разобрать определение, чтобы определить местоположение подразумеваемого десятичного знака и сделать что-то глупое, например, умножить на правильную степень десяти.
Имейте в виду, что с этими двумя последними вы можете столкнуться с другими проблемами. Если cb2java работает с текстовыми данными, но ненадежно, зачем продолжать его использовать?
О чем говорит документация cb2java? Возможно, есть что-то, что помогает там? О чем говорят "Дизайн системы", "Дизайн данных" и "Спецификация программы"?
В языке COBOL тривиально создать все данные в виде "текста" и получить все данные в виде "текста" и преобразовать их в формат, требуемый для системы COBOL. Из-за плохого дизайна вы остались делать дополнительную работу.
Если вы не можете изменить файл, я бы предложил JRecord. Даже если файл был изменен, JRecord кажется лучшим вариантом.
Да, вы уже получили законченный код, но такие вещи случаются, когда дизайн ошибается. По крайней мере, передать эту информацию обратно в процесс проектирования, чтобы это больше не повторилось.
Если вы исправите вещи просто для того, чтобы сохранить свой код, у вас будет что-то более сложное для понимания и сопровождения и более подверженное ошибкам.
Где-то по пути пропущено Подтверждение Концепции, и вы тот, кто пострадал. Не зная, что это работает, код для файла не должен был быть запущен. Я надеюсь, что у вас нет нескольких файлов. Если это POC, который вы делаете, не должно быть никаких проблем при переключении на JRecord, так что я думаю, что это не так.
Может быть, вам повезет с документацией. Помимо этого, преимущества заключаются в улучшении процесса проектирования и в вашем опыте, означающем, что вы не будете совершать подобных ошибок в будущем.
Это способ, которым cobol обрабатывает данные, даже если он не отображает кому, он знает, что это 12.3456
Для его отображения вы можете сделать (PIC 99,9999 или Z для удаления нулей):
20 ACCD-LONG-SECONDS PIC 99V9999.
20 ACCD-LONG-SECONDS-Z PIC ZZ.ZZZZ.
.
.
.
MOVE ACCD-LONG-SECONDS TO ACCD-LONG-SECONDS-Z
DISPLAY ACCD-LONG-SECONDS-Z
Почему бы не взглянуть на JRecord? http://jrecord.sourceforge.net/JRecord04.html или http://www.legsem.com/legstar/
Он более обновлен, чем cb2java.