1

JRecordライブラリを使用して Eclipse RCP アプリケーションでメインフレーム ファイルを表示しようとしています。既に COBOL コピーブックをテキスト ファイルとして持っています。それを達成するために、

  1. apache commons net FTPClient API を使用してメインフレームからデスクトップにファイルを転送しています
  2. 今、私はテキストファイルを持っています
  3. 改行文字と改行文字を削除しています
  4. 次に、CobolIoProvider を介してそれを読み取り、AbstractLine 型の ArrayList に変換します。

しかし、いくつかの特殊文字のためにオフセットの問題があります。ここに問題があります

  1. ステップ #3 を実行しないと、レコード 1 からオフセットの問題が発生します。したがって、ステップ #3 を含めました。
  2. ステップ #3 を実行しても、最初の数千のレコードは、特殊文字に遭遇しない限り、AbstractLineReader によって正しくフォーマット (または読み取り) されているように見えます (確かではありませんが、それは私の仮定です)。

コードスニペット:

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

            String filec = FileUtils.readFileToString(new File(datafile));
            System.out.println("initial len: "+filec.length());
            filec=filec.replaceAll("\r", "");
            filec=filec.replaceAll("\n", "");
            System.out.println("initial len: "+filec.length());

            fis= new ByteArrayInputStream(filec.getBytes());

            CobolIoProvider ioProvider = CobolIoProvider.getInstance();
            AbstractLineReader reader = ioProvider.newIOBuilder(copyStream, "REQUEST",
                    Convert.FMT_MAINFRAME).newReader(fis);
            AbstractLine line;
            while ((line = reader.read()) != null) {
                lines.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

ここで何が欠けていますか? メインフレームから転送されたファイルに対して行う必要がある追加の前処理はありますか?

4

2 に答える 2

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 行末マーカーを持つテキスト ファイルであることを伝えます。JRecord の FileOrganisationの説明を次に示します。

特殊文字が心配ですが、 「データ」に \n がある場合、行末として扱われます。VB ファイルの場合は、バイナリ転送を行い、RDW (Record-Descriptor-Word) を保持する必要がある場合があります。

ファイルにバイナリデータが含まれている場合は、次のものが必要です。

  • バイナリ転送を行う (VB ファイルの場合は RDW を使用)
  • 適切なファイル編成を使用する
  • Ebcdic を指定します ( .setFont("cp037")は、JRecord が US-Ebcdic であることを示します)

RecordEditorを使用してコードを生成するための 2 つ目の回答を追加します。


すべてのレコードが同じ長さであることが確実な場合は、低レベルのルーチンを使用して読み取りを行うことができます 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));
    }
于 2016-07-30T23:23:57.653 に答える
3

将来の参照/バイナリ ファイル

ファイルにBinary Dataが含まれている場合は、バイナリ転送を行う必要があります。RecordEditorが役立つ場合があります。

RecordEditor 0.98には、JRecord コード生成 機能があります。RecordEditor Generate関数を使用する利点は次のとおりです。

  • Recordeditor は、ファイルを見て適切なファイル属性を見つけようとします。
  • さまざまな属性を試して (左側のペイン)、それらの属性でファイルがどのように見えるかを確認できます (右側のペイン)。
  • 満足したら、Generate ボタンをクリックすると、RecordEditorが JRecord コードを生成します。利用可能ないくつかのコード テンプレートが あります。

    • 標準- 基本的な JRecord コードを生成します (フィールド名クラスを使用)
    • lineWrapper - get/set メソッドとして表される Cobol フィールドを持つ「ラッパー」クラスを生成します

RecordEditor 生成

RecordEditorで Generate >>> Java~JRecord code for Cobol を選択します

ここに画像の説明を入力

画面生成

COBOL CopyBook / Sample ファイルを入力し、必要に応じて属性を調整します

ここに画像の説明を入力

コード テンプレート

次に、コード テンプレートを選択できます。

ここに画像の説明を入力

生成コード

最後に、RecordEditorは、入力された属性に基づいて JRecord コードを生成します。

ここに画像の説明を入力

于 2016-07-31T03:13:14.157 に答える