首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache梁中EBCDIC到ASCII的转换

Apache梁中EBCDIC到ASCII的转换
EN

Stack Overflow用户
提问于 2017-10-04 18:06:50
回答 2查看 1.1K关注 0票数 1

我试图使用Apache中的CobolIoProvider类将EBCDIC文件转换为ASCII。

我正在使用的代码:

代码语言:javascript
复制
CobolIoProvider ioProvider = CobolIoProvider.getInstance();
AbstractLineReader reader  = ioProvider.getLineReader(Constants.IO_FIXED_LENGTH, Convert.FMT_MAINFRAME,CopybookLoader.SPLIT_NONE, copybookname, cobolfilename);

代码根据需要读取和转换文件。我只能从本地系统中读取cobolfilename和copybookname,它们基本上是EBCDIC文件和拷贝簿的路径。但是,当我尝试从GCS读取文件时,FileNotFoundException会失败--“文件名、目录名或卷标签语法不正确”。

是否有使用CobolIoProvider类从GCS读取Cobol文件(EBCDIC)的方法?

如果没有,是否有其他类可以将Cobol文件(EBCDIC)转换为ASCII并允许从GCS读取文件。

使用ICobolIOBuilder的:-

我正在使用的代码:

代码语言:javascript
复制
ICobolIOBuilder iob = JRecordInterface1.COBOL.newIOBuilder("copybook.cbl")
                                    .setFileOrganization(Constants.IO_FIXED_LENGTH)
                      .setSplitCopybook(CopybookLoader.SPLIT_NONE);

AbstractLineReader reader = iob.newReader(bs); //bs is an InputStream object of my Cobol file

不过,以下是一些关注事项:-

( 1)我必须在本地保留我的copybook.cbl。有没有办法从GCS中读取文案文件。我尝试了下面的代码,尝试从GCS读取我的抄写簿到Stream,并将流传递给LoadCopyBook()。但密码不起作用。

示例代码如下:

代码语言:javascript
复制
InputStream  bs2 = new ByteArrayInputStream(copybookfile.toString().getBytes());
LayoutDetail schema = new CobolCopybookLoader()
                     .loadCopyBook(   bs, " copybook.cbl",
                         CopybookLoader.SPLIT_NONE, 0, "",
                         Constants.USE_STANDARD_COLUMNS,
                         Convert.FMT_INTEL, 0, new TextLog())
                           .asLayoutDetail();

AbstractLineReader reader = LineIOProvider.getInstance().getLineReader(schema);

reader.open(inputStream, schema);

2)使用newReader从流中读取EBCDIC文件没有将我的文件转换为ascii。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-04 22:15:42

我没有完整的答案。如果您正在使用建议的最新版本,请更改JRecord代码以使用JRecordIO-Builder比旧的CobolIoProvider接口灵活得多。

代码语言:javascript
复制
String encoding = "cp037"; // cp037/IBM037 US ebcdic; cp273 - German ebcdic 
ICobolIOBuilder iob = JRecordInterface1.COBOL
       .newIOBuilder("CopybookFile.cbl") 
            .setFileOrganization(Constants.IO_FIXED_LENGTH)
            .setFont(encoding);  // should set encoding if you can

AbstractLineReader reader = iob.newReader(datastream);

使用IO-Builder接口,您可以使用流。这个问题Stream file from Google Cloud Storage是关于从GCS创建流的,可能很有用。希望对GCS有更多了解的人能提供帮助。

或者,您可以直接从GCS读取数据,并使用JRecord-IO-Builder的newLine方法创建数据行(数据记录)。

代码语言:javascript
复制
     AbstractLine l = iob.newLine(byteArray);

我将考虑为JRecord创建一个基本的读/写接口,这样JRecord用户就可以在那里编写自己的接口到GCS或IBM大型机访问(ZFile)等等,但这需要时间。

票数 1
EN

Stack Overflow用户

发布于 2017-10-04 21:45:01

用新的基于文件的源使用Beam/Dataflow最简单的方法是首先使用FileIO获取PCollection<ReadableFile>,然后使用DoFn读取该文件。这将需要实现从给定通道读取的代码。如下所示:

代码语言:javascript
复制
Pipeline p = ...
p.apply(FileIO.match().filepattern("..."))
 .apply(FileIO.readMatches(...))
 .apply(new DoFn<ReadableFile, String>() {
   @ProcessElement
   public void processElement(ProcessContext c) {
     try (ReadableByteChannel channel = c.element().open()) {
       // Use CobolIO to read from the byte channel
     }
   });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46571413

复制
相关文章

相似问题

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