当前位置: 首页 > 知识库问答 >
问题:

在Apache Beam中将EBCDIC转换为ASCII

司徒高寒
2023-03-14

我正在尝试使用Apache Beam中JRecord中的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文件和copybook的路径。但是,当我试图从GCS读取文件时,它失败了,FileNotFoundException--“文件名、目录名或卷标语法不正确”。

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

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

我正在使用的代码:

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 html" target="_blank">object of my Cobol file

然而,这里有几个问题:-

1)我必须在本地保存我的copybook.cbl。有没有办法从GCS读取copybook文件。我尝试了下面的代码,试图从GCS读取copybook到Stream,并将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。

谢了。

共有1个答案

戚晨
2023-03-14

在新类型的基于文件的源中使用beam/dataflow的最简单方法是首先使用fileio获取pcollection ,然后使用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
     }
   });
 类似资料:
  • 问题内容: 我应该通过使用Java将EBCDIC文件转换为ASCII。到目前为止,我有以下代码: 文件描述如下: 我们可以忽略每一行的前2个字节。问题是字节存在USAGE IS COMP,因为读者无法正确转换它们,我想我应该将它们读取为字节或其他内容,尽管我不知道如何。 问题答案: 如果我正确地解释了这种格式,则您的二进制文件格式具有固定长度的记录。其中一些记录不是字符数据(COBOL计算字段?)

  • 我们有PHP服务器代码,在iSeries中端执行SQL语句。 以下是SQL查询的简化版本 查询执行得很好,问题是当使用诸如“sometext”“title”这样的静态字段/值时,结果在PHP中返回时,它们不是所需的格式 谢了! 编辑 根据bucks的建议,我们将用户配置文件CCSID更改为37,而不是65535 解决方案是将用户配置文件改为使用CCSID37,并将服务器作业改为使用CCSID37。

  • 问题内容: 我需要编写一个“简单”实用程序以将ASCII转换为EBCDIC吗? Ascii来自Java,Web和AS400。我周围有一个google,似乎找不到一个简单的解决方案(也许因为没有一个:()。我希望使用开源util或为已经编写的util付费。 这样吧? 谢谢, 史考特 问题答案: JTOpen是IBM Java工具箱的开源版本,它具有访问AS / 400对象的类的集合,包括用于访问本机

  • 我尝试过使用python 2.6将EBCDIC转换为ASCII,但在这方面存在许多问题,比如压缩字段没有得到转换,记录计数增加。 是否有任何方法转换EBCDIC文件压缩字段到ASCII格式。