2011-11-13 6 views
2

メモリに保持され、Java Readerから読み込んだCSVテキストに対してSQLクエリを実行する方法はありますか? StringReader。H2データベースでは、Java Readerから読み込んだCSVテキストでSQLクエリを実行できます。 StringReader?

org.h2.tools.Csv.read(Reader reader、String [] colNames)を使用すると、すべての行と列を含む結果セットを取得できます。しかし、私は実際にリーダーから読み取ったCSVテキストのクエリを実行したいと考えています。

バックグラウンド - 各エンティティの複数のCSVセクションを含むファイルを受け取ります(Can H2 Database query a CSV file containing multiple sections of different record groups?を参照)。ファイルの解析中に必要なCSVセクションをそれぞれString(各1つのString)に保存します。これは、短時間の間だけデータをメモリに保持し、各CSVセクションは比較的小さいので、メモリを駄目にしてはいけません。これらのCSVセクションでクエリを実行して、ドキュメントをカスタム形式でビルドする必要があります。

各CSVセクションをファイル(ファイルのセットとして)に書き込んでCSVREADを使用することはできますが、できるだけ速く、セクションを分割して書き込むためにはアプリケーションを必要としませんディスクにはハードドライブをスラッシュして死に至らしめる。

答えて

1

結果セットを返すuser defined functionを記述し、それを使用して必要な行を生成することができます。ユーザー定義関数内では、H2からCsvツール(実際にはCsvツール)を使用できます。

+0

ああ - あなたが何を意味するのか分かります。だから、H2データベースに追加するのは便利な機能かもしれません.CSVREAD(filename csvcontent)のような組み込み関数CSVREADを含めることですが、CSVファイルの名前を渡す代わりに、実際のCSVコンテンツを含む文字列に変換します。もちろん、これはCSVデータが比較的小さい場合にのみ役立ちます。 – nicciglen

0

DBMSは通常、独自の最適化されたデータストレージのみを照会できるため、これは直接行うことはできません。前述のorg.h2.tools.Csv.readのテキストをテーブルにインポートし、そのテーブルに対してクエリを実行する必要があります。テーブルは、メモリが十分であると仮定して、ディスクへの書き込みを防止するための一時的なものであってもよい。

+0

はい、私はあなたが意味することを理解していますが、これまでにH2データベースJava API呼び出しを見つけて、org.h2.toolsから返された結果セットから新しいテーブル(一時的なテーブル)を直接作成することができませんでした。 Csv.read(...)。それ以外の場合は、結果セットの各行をJavaで順番に循環させ、新しく作成された一時テーブルに各行を挿入する必要があります。しかし、本当にそのようなJava API呼び出しがある場合は、私にお知らせください(結果セットからテーブルを直接作成するため)。 – nicciglen

関連する問題