フォーラム: 公開討議 (スレッド #37055)

TERASOLUNA Batchを利用したファイル入出力の実現方法について (2015-08-13 20:39 by TERASOLUNAの入門者 #76733)

お世話になります。

TERASOLUNA Batchを利用して以下のような
処理を実現したいと考えておりますが実現
は可能でしょうか。

1.ファイルA、ファイルBを読み込む
2.読み込んだファイルAの情報を元にファイルBを更新する
3.2で更新したファイルBを出力する。

複数ファイルを持回る方法、また入力したファイルに
対して出力を行う方法が分からず苦慮しております。

実現方法をご存じのかたがいらっしゃいましたら
ご教示お願い致します。

何卒、宜しくお願い致します。

メッセージ #76733 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: TERASOLUNA Batchを利用したファイル入出力の実現方法について (2015-08-18 18:09 by tajirim #76761)

[メッセージ #76733 への返信]
> 1.ファイルA、ファイルBを読み込む
> 2.読み込んだファイルAの情報を元にファイルBを更新する
> 3.2で更新したファイルBを出力する。
> 複数ファイルを持回る方法、また入力したファイルに
> 対して出力を行う方法が分からず苦慮しております。

ファイルBのフォーマットやエラー時のリカバリ方法にもよりますが、
方法は大きく2通りあります。
※Batch3を前提として回答しています。

<方法A: ファイルBをDBに取り込み、更新後、ファイルに出力する>
1. 前処理として、ファイルBをDBに取り込む。
2. 主処理として、ファイルAのレコードごとに、DBを更新する。
(コレクタでファイルAを開いて、レコード数分実行されるところでDBを更新する)
3. ファイルAのレコードが無くなったら、後処理として、DBで更新済みの情報をファイルBに出力する。

<方法B: ファイルBをランダムアクセスで直接更新する>
前提条件:
・ファイルBは固定長フォーマットである。
・ジョブが途中で異常終了した場合、ファイルBが中途半端に更新された状態であってもよい。
1. 前処理として、java.io.RandomAccessFileを用いて、ファイルBを読み書きモードで開き、
一旦最初から最後まで読み、レコードを特定するための主キーの値と、
ファイル上の位置(RandomAccessFile#seekに渡すlong値)を対応づけて、
HashMap等に保持しておく。
(ファイルAのレコードを処理するたびにファイルBの更新位置を探していると、
無駄に時間がかかってしまうため、
主キーの値とファイルB内のレコードの先頭位置をマッピングしておき、
レコードの先頭位置+定数で、更新位置が決定できるようにする。)
2. 主処理として、ファイルAのレコードごとに、ファイルBを更新する。
(前処理でファイルBを開いたRandomAccessFileを利用する。)
3. ファイルAのレコードが無くなったら、後処理として、ファイルBを開いたRandomAccessFileをcloseする。

※「前処理」はコレクタのループより上、
「主処理」はコレクタのループ内、
「後処理」はコレクタのループより下に配置する処理を意図しています。

方法Bは、文字通り、ファイルBを入力かつ出力ファイルにする方法で、DBは不要なのですが、
方法Aの方が汎用的です。
#76733 への返信

メッセージ #76761 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする

Re: TERASOLUNA Batchを利用したファイル入出力の実現方法について (2015-08-19 18:15 by TERASOLUNAの入門者 #76764)

ご回答ありがとうございました。

今回の開発の前提条件として、DBへのアップロードについて
はコマンドを使用して一括で実行することとなっておりレコード
ごとの更新は行えない方針となっております。

そのため、DBデータをCSV形式で出力し、CSVファイルとして更新
を実行する必要があるため残念ながらご提示いただいた処理方式
を採用することは難しくなっています。

またファイル自体も可変長のファイルとなってしまうため方法Bを
使用した処理方式についても採用ができません。

前提条件の記述をせずに質問をしてしまい申し訳ありませんでした。

処理内容について再度検討し、処理を細かく分割することでファイルと
DBを合わせた形で処理を行えるよう検討したいと思います。
#76761 への返信

メッセージ #76764 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする