我试图使用Apache中的CobolIoProvider类将EBCDIC文件转换为ASCII。
我正在使用的代码:
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的:-
我正在使用的代码:
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()。但密码不起作用。
示例代码如下:
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。
谢谢。
发布于 2017-10-04 22:15:42
我没有完整的答案。如果您正在使用建议的最新版本,请更改JRecord代码以使用JRecordIO-Builder比旧的CobolIoProvider接口灵活得多。
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方法创建数据行(数据记录)。
AbstractLine l = iob.newLine(byteArray);我将考虑为JRecord创建一个基本的读/写接口,这样JRecord用户就可以在那里编写自己的接口到GCS或IBM大型机访问(ZFile)等等,但这需要时间。
发布于 2017-10-04 21:45:01
用新的基于文件的源使用Beam/Dataflow最简单的方法是首先使用FileIO获取PCollection<ReadableFile>,然后使用DoFn读取该文件。这将需要实现从给定通道读取的代码。如下所示:
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
}
});https://stackoverflow.com/questions/46571413
复制相似问题