0

CSVファイルで利用できるデータがあります。各CSVは別のCSVとは異なります。つまり、列名が異なります。たとえば、FileAでは一意の識別子はIDと呼ばれますが、FileBではUIDと呼ばれます。同様に、FileAでは金額はAMTと呼ばれますが、FileBではCUST_AMTと呼ばれます。意味は同じですが、列名が異なります。

このさまざまなデータをCSVファイルからDBテーブルに保存するための一般的なソリューションを作成したいと思います。このソリューションでは、将来利用可能になる可能性のある追加のフォーマットを考慮に入れる必要があります。

そのようなシナリオに最適なアプローチはありますか?

4

2 に答える 2

0

実行開始時の「責任の連鎖」のパターンが思い浮かびます。したがって、ヘッダーを読み、責任の連鎖にそのファイルの適切なパーサーを取得させます。

コードは次のようになります。

interface Parser {
  // returns true if this parser recognizes this format.
  boolean accept(String fileHeader);

  // Each parser can convert a line in the file into insert parameters to be 
  // used with PreparedStatement
  Object[] getInsertParameters(String row);
}

これにより、チェーンに新しいパーサーオブジェクトを追加することにより、新しいファイル形式を追加できます。

まず、チェーンを次のように初期化します。

List<Parser> parserChain = new ArrayList<Parser>();
parserChain.add(new ParserImplA());
parserChain.add(new ParserImplB());
parserChain.add(new ParserImplB());
....

次に、次のように使用します。

 // read the header row from file
 Parser getParser (String header) {
    for (Parser parser: parserChain) {
        if (parser.accept(header) 
            return parser;
        }
     throw new Exception("Unrecognized format!");
}

次に、テーブルに行を挿入するためのプリペアドステートメントを作成できます。ファイルの各行の処理は次のようになります。

preparedStatement.execute(parser.getInsertParameters(row));
于 2012-10-30T06:35:51.617 に答える
0

この問題には多くの解決策があります。しかし、最も簡単なのは、各入力ファイル形式から結合された行形式へのマッピングを生成することだと思います。列名からデータベース フィールド名へのマッピングを持つ構成ファイルを作成し、CSV とマッピング ファイルを指定して、すべてのデータをデータベースに挿入できるプログラムを作成できます。

ただし、追加する新しい列ごとにテーブルを変更する必要があります。

設計作業が増えると、データベースに入った後のデータの使用方法について、より詳細な情報が必要になります。

于 2012-10-30T05:24:44.560 に答える