首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COMP-3数据解压缩用Java (嵌入在五旬节中)

COMP-3数据解压缩用Java (嵌入在五旬节中)
EN

Stack Overflow用户
提问于 2016-02-15 16:41:19
回答 1查看 3.6K关注 0票数 2

我们正面临一个挑战,在读取COMP-3数据的Java内嵌在五旬斋ETL内。很少有浮点值与其他纯文本一起作为打包小数存储在平面文件中。当纯文本被正确阅读时,我们尝试使用Charset.forName("CP500");,但它从未起作用。我们还有垃圾人物。

由于五旬节脚本不支持COMP-3,所以他们建议在论坛上使用User Defined Java class。如果你遇到并解决了这个问题,有人能帮我们吗?

EN

回答 1

Stack Overflow用户

发布于 2016-02-15 21:00:03

这是一个Cobol文件吗?,你有Cobol文案吗?可能的选择包括

  1. 正如Bill所说,将Comp-3转换为源计算机上的文本。
  2. 编写您自己的转换代码
  3. 使用像JRecord这样的库。备注:我是JRecord的作者

转换Comp-3

在第三部,

代码语言:javascript
复制
Value    Comp-3 (signed)   Comp-3 (Unsigned)   Zoned-Decimal
 123     x'123c'           x'123f' ??            "12C"
-123     x'123d'                                 "12L" 

将comp-3转换为十进制整数的方法不止一种.一种方法是

  1. 连接x‘123 c’->>字符串“123 c”
  2. 删除最后一个字符并测试该符号

将comp3转换为Java代码(从字节数组:

代码语言:javascript
复制
        public static String getMainframePackedDecimal(final byte[] record,
                                               final int start,
                                               final int len) {  

            String hex  = getDecimal(record, start, start + len);
                //Long.toHexString(toBigInt(start, len).longValue());
            String ret  = "";
            String sign = "";

            if (! "".equals(hex)) {
                switch (hex.substring(hex.length() - 1).toLowerCase().charAt(0)) {
                    case 'd' : sign = "-";
                        case 'a' :
                        case 'b' :
                        case 'c' :
                        case 'e' :
                        case 'f' :
                            ret = sign + hex.substring(0, hex.length() - 1);
                        break;
                        default:
                            ret = hex;
                }
            }

            if ("".equals(ret)) {
                ret = "0";
            }
        }

        public static String getDecimal(final byte[] record, final int start, final int fin) {
            int i;
            String s;
            StringBuffer ret = new StringBuffer("");
            int b;

            for (i = start; i < fin; i++) {
                b = toPostiveByte(record[i]);
                s = Integer.toHexString(b);
                if (s.length() == 1) {
                    ret.append('0');
                }
                ret.append(s);

            }

            return ret.toString();
        }

JRecord

JRecord中,如果您有一本Cobol抄写本,则有

  • Cobol2Csv使用Cobol文案将Cobol数据文件转换为CSV的程序。
  • Data2Xml使用Cobol文案将Cobol数据文件转换为Xml。
  • 阅读Cobol -带有Cobol文案的数据文件。
  • 用Xml描述读取固定宽度的文件
  • 在Java中定义字段

用JRecord中的Cobol文案阅读

代码语言:javascript
复制
        ICobolIOBuilder ioBldr = JRecordInterface1.COBOL
                .newIOBuilder(copybookName)
                    .setDialect( ICopybookDialects.FMT_MAINFRAME)
                    .setFont("cp037")
                    .setFileOrganization(Constants.IO_FIXED_LENGTH)
                .setDropCopybookNameFromFields(true);
        AbstractLine saleRecord;

        AbstractLineReader reader  = ioBldr.newReader(salesFile);
        while ((saleRecord = reader.read()) != null) {
            ....
        }

        reader.close();

用JRecord定义Java文件

代码语言:javascript
复制
        AbstractLineReader reader = JRecordInterface1.FIXED_WIDTH.newIOBuilder()
                                .defineFieldsByLength()
                                    .addFieldByLength("Sku"  , Type.ftChar,   8, 0)
                                    .addFieldByLength("Store", Type.ftNumRightJustified, 3, 0)
                                    .addFieldByLength("Date" , Type.ftNumRightJustified, 6, 0)
                                    .addFieldByLength("Dept" , Type.ftNumRightJustified, 3, 0)
                                    .addFieldByLength("Qty"  , Type.ftNumRightJustified, 2, 0)
                                    .addFieldByLength("Price", Type.ftNumRightJustified, 6, 2)
                                .endOfRecord()
                                .newReader(this.getClass().getResource("DTAR020_tst1.bin.txt").getFile());
        AbstractLine saleRecord;

        while ((saleRecord = reader.read()) != null) {
        }

分区十进制

另一个大型机-Cobol数字格式是分区-十进制。这是一种文本格式,在最后一个数字上,符号被过度输入.在分区-十进制123是"12C“,而-123是"12L”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35414574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档