JRecord - 格式化从大型机传输的文件

时间:2016-07-30 09:07:32

标签: ftp eclipse-rcp cobol apache-commons-net jrecord

我正在尝试使用JRecord库在eclipse RCP应用程序中显示一个大型机文件。我已经将COBOL副本作为文本文件。 要做到这一点,

  1. 我正在将文件从大型机传输到我的桌面 apache commons net FTPClient API
  2. 现在我有一个文本文件
  3. 我正在删除换行符和回车符
  4. 然后我通过。,CobolIoProvider读取它并将其转换为AbstractLine类型的ArrayList
  5. 但是由于一些特殊的特征,我已经抵消了问题。 这是问题

    1. 当我不执行第3步时,就会出现偏移问题 记录1.因此我包括了步骤#3
    2. 即使我执行步骤#3,除非遇到特殊字符(不确定,但这是我的假设),否则AbstractLineReader会正确地格式化(或读取)记录的前几个元素。
    3. 代码段:

      ################################
      #2nd tabpanel for Reactive Map
      tabPanel("Reactive Map", 
      
        #SideBarLayout for sidebar Panel for the options of the map       
        sidebarLayout(
      
          #SideBar Panel with options to adjust the map
          sidebarPanel(
      
            #Databases selection
            selectInput("chDatabaseMap","Choose DataBase:", 
                choices = c("BPD 2013 Baltimore", "BPD 2014 Baltimore"))
          ),
          ###################################       
          #Main panel to put plots  
          mainPanel(
            plotOutput("MapPr")
          )
        )
      )
      

      我在这里缺少什么?是否需要对从大型机传输的文件进行额外的预处理?

2 个答案:

答案 0 :(得分:3)

如果是带有\ r \ n行分隔符的文本文件(无二进制数据),请尝试:

    ArrayList<AbstractLine> lines = new ArrayList<AbstractLine>();
    InputStream copyStream;
    InputStream fis;
    try {
        copyStream = new FileInputStream(new File(copybookfile));

        AbstractLineReader reader = CobolIoProvider.getInstance() 
            .newIOBuilder(copyStream, "REQUEST", ICopybookDialects.FMT_MAINFRAME)
                .setFileOrganization(Constants.IO_STANDARD_TEXT_FILE)
            .newReader(datafile);
        AbstractLine line;
        while ((line = reader.read()) != null) {
            lines.add(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

注意: setFileOrganization 告诉JRecord 它是什么类型的文件。所以 .setFileOrganization(Constants.IO_STANDARD_TEXT_FILE)告诉JRecord它是一个带有\ n或\ r \ n行尾标记的文本文件。这是Description of FileOrganisation in JRecord

特殊字符让我担心,如果'数据'中有\ n,它将被视为行尾。如果它是VB文件,您可能需要进行二进制传输并保留RDW(Record-Descriptor-Word)。

如果文件包含二进制数据,则需要:

  • 进行二进制传输(如果是VB文件则使用RDW)
  • 使用适当的文件组织
  • 指定Ebcdic( .setFont(“cp037”)告诉JRecord是US-Ebcdic)

我将使用 RecordEditor

生成代码添加第二个答案

如果您完全确定所有记录的长度相同,则可以使用低级例程进行阅读,请参阅https://sourceforge.net/p/jrecord/discussion/678634/thread/4b00fed4/中的ReadAqtrans.java程序

基本上你会这样做:

    ICobolIOBuilder iobuilder = CobolIoProvider.getInstance()
            .newIOBuilder("copybookFileName", ICopybookDialects.FMT_MAINFRAME)
                    .setFont("CP037")
                    .setFileOrganization(Constants.IO_FIXED_LENGTH);
    LayoutDetail layout = iobuilder.getLayout();
    FixedLengthByteReader br 
         = new FixedLengthByteReader(layout.getMaximumRecordLength() + 2);
    br.open("...");

    byte[] bytes;
    while ((bytes = br.read()) != null) {           
        lines.add(iobuilder.newLine(bytes));
    }

答案 1 :(得分:3)

未来参考/二进制文件

如果文件包含二进制数据,则确实需要进行二进制传输。您可能会发现RecordEditor很有用。

RecordEditor 0.98有一个JRecord code Generation 功能。使用 RecordEditor生成功能的优点是

  • Recordeditor将通过查看文件
  • 来尝试找出相应的文件属性
  • 您可以尝试各种属性(左侧窗格),并查看文件与这些属性的外观 (右手边)。
  • 如果满意,请点击“生成”按钮, RecordEditor 将生成JRecord代码。有几个代码模板 可用的:

    • 标准 - 将生成基本的JRecord代码(带有字段名称类
    • lineWrapper - 将生成一个“包装”类,其中Cobol字段表示为get / set方法

RecordEditor生成

RecordEditor 中选择生成&gt;&gt;&gt; Cobol的Java~JRecord代码

enter image description here

生成屏幕

输入Cobol CopyBook / Sample文件并根据需要调整属性

enter image description here

代码模板

接下来,您可以选择代码模板

enter image description here

生成代码

最后 RecordEditor 将根据输入的属性生成JRecord代码。

enter image description here