首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取压缩小数并在春季启动时转换为数字

读取压缩小数并在春季启动时转换为数字
EN

Stack Overflow用户
提问于 2022-03-23 14:12:54
回答 1查看 211关注 0票数 1

全,

我使用Spring引导应用程序将数据存储在DB中。我是通过Kafka主题从IBM获得这些数据的。我得到的信息以EBCDIC格式,所以使用cobol版权,JRecord,cb2xml jars转换为可读的格式,并存储在DB。

现在,我也以同样的方式获得另一个文件,但转换后的数据如下所示:

代码语言:javascript
复制
10020REFUNDONE
10021REFUNDTWO ·"   ÷/
10022REFUNDTHREE   oú^  " 
10023REFUNDFOUR              ¨jÄ ò≈

下面是我如何从ebcdic转换为可读格式:

代码语言:javascript
复制
AbstractLineReader reader = null;
StringBuffer finalBuffer = new StringBuffer();
        try {
            String copybook = "/ds_header.cbl";
            reader = CustomCobolProvider.getInstance().getLineReader(copybook, Convert.FMT_MAINFRAME, new BufferedInputStream(new ByteArrayInputStream(salesData)));
AbstractLine line;
        while ((line = reader.read()) != null) {
            if (null != line.getFieldValue(REC_TYPE)){
                finalBuffer.append(line.getFullLine());
            }
        }
            }

这是我的getLineReader方法:

代码语言:javascript
复制
public AbstractLineReader getLineReader(String copybook, int numericType, InputStream fileStream) throws Exception {

        String font = "";
        if (numericType == 1) {
            font = "cp037";
        }

        InputStream stream = CustomCobolProvider.class.getResourceAsStream(copybook);

        if(stream == null ) throw new RuntimeException("Can't Load the Copybook Metadata file from Resource....");
        LayoutDetail copyBook = ((ExternalRecord)this.copybookInt.loadCopyBook(stream, copybook, CopybookLoader.SPLIT_REDEFINE, 0, font, CommonBits.getDefaultCobolTextFormat(), Convert.FMT_MAINFRAME, 0, (AbsSSLogger)null).setFileStructure(Constants.IO_FIXED_LENGTH)).asLayoutDetail();
        AbstractLineReader ret = LineIOProvider.getInstance().getLineReader(copyBook, (LineProvider)null);
        ret.open(fileStream, copyBook);
        return ret;
    }

我被困在这里的数字转换,我要知道它是在十进制包装。我没有cobol和大型机的知识,引用了很少的站点,并且知道如何从ebcdic转换为可读格式。请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 07:59:34

问题是getFullLine()方法不执行任何字段转换;您需要访问各个字段。您可以使用line.getFieldIterator(0)来获得行的字段迭代器。

另外,除非您使用的是一个古老版本的JRecord,否则最好使用JRecordInterface1类。

有些事情应该是可行的,如下所示:

代码语言:javascript
复制
    StringBuffer finalBuffer = new StringBuffer();

    try {
        ICobolIOBuilder iob = JRecordInterface1.COBOL .newIOBuilder(copybookName)
                               .setFont("cp037") 
                               .setFileOrganization(Constants.IO_FIXED_LENGTH)
                                   ;  


        AbstractLineReader reader = iob.newReader(dataFile);
        while ((line = reader.read()) != null) {
            String sep = "";
            for (AbstractFieldValue fv : line.getFieldIterator(0)) {
                finalBuffer.append(sep).append(fv);
                sep = "\t";
            }
            finalBuffer.append("\n");
        }

        reader.close();
    } catch (Exception e) {
       // what ever ....
    }

其他要点

使用MQ数据源,您不需要创建行读取器。您可以直接从字节数组创建行:

代码语言:javascript
复制
        ICobolIOBuilder iob = JRecordInterface1.COBOL .newIOBuilder(copybookName)
                               .setFont("cp037") 
                               .setFileOrganization(Constants.IO_FIXED_LENGTH)
                                   ;  

        AbstractLine line = iob.newLine(byteArrayFromMq);
        for (AbstractFieldValue fv : line.getFieldIterator(0)) {
            // what ever
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71588720

复制
相关文章

相似问题

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