2011-07-06 8 views
0

私は、パイプで区切られたフラットファイルとデータベーステーブルを持っています。私はフラットファイルとデータベースの違いをすべて含んだ2番目のフラットファイルを作成したいと思います。Javaのデータベースとフラットファイルの値を比較するにはどうすればよいですか?

フラットファイルに存在しないエントリがデータベースに存在する場合、2番目のフラットファイルに行全体が印刷されます(フラットファイルにはエントリが存在しません。データベース)。別の例としては、行が似ているが、フィールドに違いがある場合は、データベースエントリがフラットファイルに印刷されます。

これを行うには、フラットファイルアレイにプライマリキーが存在しない場合は、フラットファイルとデータベースからのデータを含む2つの2次元配列を作成することをお勧めします。 selectステートメント主キーが存在するが他のフィールドが存在しない場合は、selectステートメントから結果を出力します。これは私が考えることができる最高のものですが、非効率的です。

これを行うより良い方法はありますか?私はこれを行うためにJavaを使用しています。

+0

ほとんどのデータベースはファイルを直接読み取る機能を持っています。操作全体はSQLから実行でき、アプリケーション言語よりも優れています。 –

+0

あなたは何のデータ量を出しており、ソースファイルは注文されていますか?フラットファイルがDBからアクセス可能な場合は、SQL /外部テーブルソリューションに向かう傾向があります。データボリュームが些細なものであれば、Javaはそのトリックを行うことができます。 –

答えて

1

すでにデータベースと比較しているので、SQLですべてを実行するだけではどうですか?ファイルの内容をデータベースにアップロードし、2つの補集合(AマイナスBおよびBマイナスA)を見つけて別のファイルにエクスポートします。あなたのデータ間の差分を構築し、単に

0

データベースからデータを取得するJavaプログラムを、フラットファイルに、既に持っているファイルと同じ形式で書き込みます。

、例えば、あなたのレコードの主キーを両方のファイルが同じフィールドで並べられていることを確認します - それは(ソートキーは、最後の数である)などの入力ファイルの場合には、たとえば、awkすることによって達成することができます。

val1|2 
val7|1 

sort -n --field-separator=\| -k 2 1でエントリを並べ替えることができます(関連するオプションの説明については、sortのマンページを参照してください)。

次に、異なるエントリのファイルを作成するためにdiff(またはUnix/Linuxにない場合は同様)ユーティリティを使用してください。

+0

返されるデータベースの結果がフラットファイルの結果と異なる場合はどうなりますか?提供されているフラットファイルに保証されている注文がない場合でも最悪です。 – mtrovo

+0

@mtrovo - データベースから取得する前に、キーのフラットファイルを読み取る – KevinDTimm

+0

@mtrovo素敵な修正!私は答えを更新しました。 –

1

、単純な選択を作成し、私はこのような何かをするだろう:ような何か:

  • キーが主キー列で、値が行自体であるマップ構造にデータベースから結果をロードする
  • フラットファイルコレクションを繰り返し、主キーに基づいてマップ構造を検索し、その差異を出力になるリストに追加します。
  • 以前にリストに保存した差異を出力に書き出します。
0

をエクスポートしますあなたは、ファイルtutorial for external tables

から外部表を作成することができますOracleで

SPOOL diff.txt 
SELECT * FROM flatfile_table 
MINUS 
SELECT * FROM db_table 
UNION 
SELECT * FROM db_table 
MINUS 
SELECT * FROM flatfile_table 
ORDER BY SortCriteria; 
SPOOL OFF 
関連する問題