3

Excel ファイル (および csv ファイル) に大量のデータのコレクションがあります。データはデータベース (mysql) に配置する必要があります。ただし、データベースに入る前に処理する必要があります。たとえば、列 1 が列 3 より小さい場合、列 2 に 4 を追加します。情報が永続化される前に、従わなければならない規則がかなりあります。

このタスクを達成するために従うべき良い設計は何でしょうか? (Java を使用)

その他の注意事項

このプロセスは自動化する必要があります。手動でデータを変更する必要がないという意味で。これは、1 行あたり 15 列の情報を持つ数千行のデータのことです。

現在、私は一種の一連の責任設計をセットアップしています。ルールごとに 1 つのクラス (Java)。1 つのルールが完了すると、次のルールが呼び出されます。

より詳しい情報

通常、データ シートごとに約 5000 行あります。この大きな入力は頻繁に発生するわけではないため、速度は大きな問題ではありません。

私はドロールを検討しましたが、タスクがドロールに十分に複雑であるかどうかはわかりませんでした.

ルールの例:

  1. すべての通貨 (特定の列のデータ) に通貨記号を含めることはできません。

  2. カテゴリ名は統一する必要があります (例: book case = bookcase)

  3. エントリー日に将来の日付を指定することはできません

  4. テキスト入力には [AZ 0-9 \s] のみを含めることができます

など。
さらに、情報の列が無効な場合は、処理が完了したときに報告する必要があります (または処理を停止する可能性があります)。

私の現在のソリューションは機能します。ただし、改善の余地があると思うので、どのように改善できるか、または他の人が同様の状況にどのように対処したかについての理想を探しています.

私は (非常に簡単に) drools を使用することを検討しましたが、drools を利用できるほど作業が複雑であるかどうかはわかりませんでした。

4

8 に答える 8

1

あなたの方法はOKだと思います。特に、すべてのプロセッサで同じインターフェイスを使用している場合。

また、現在は Jboss-rules である Drules と呼ばれるものを検討することもできます。少し前にアプリのルールの多い部分にそれを使用しましたが、気に入ったのは、ビジネス ロジックをたとえばスプレッドシートや DSL で表現して、Java にコンパイルできることです (実行時にコンパイル時のオプションでもあります)。これにより、ルールがもう少し簡潔になり、読みやすくなります。また、習得も非常に簡単です (2 日程度)。

オープンソースのJboss-rulesへのリンクは次のとおりです。jboss.com では、企業の好みに合わせて、公式に維持されているバージョンを間違いなく購入できます。

于 2008-10-11T15:51:36.080 に答える
1

(Oli が言及しているように) 1 つのステップでこれを行う気にならない場合は、おそらくパイプとフィルターの設計を使用するでしょう。あなたのルールは比較的単純なので、おそらくいくつかのデリゲート ベースのクラスを作成します。例 (C# コードですが、Java はかなり似ているはずです...おそらく誰かが翻訳できますか?):

interface IFilter {
   public IEnumerable<string> Filter(IEnumerable<string> file) {
   }
}

class PredicateFilter : IFilter {
   public PredicateFilter(Predicate<string> predicate) { }

   public IEnumerable<string> Filter(IEnumerable<string> file) {
      foreach (string s in file) {
         if (this.Predicate(s)) {
            yield return s;
         }
      }
   }
}

class ActionFilter : IFilter {
  public ActionFilter(Action<string> action) { }

  public IEnumerable<string> Filter(IEnumerable<string> file) {
      foreach (string s in file) {
         this.Action(s);
         yield return s;
      }
  }
}

class ReplaceFilter : IFilter {
  public ReplaceFilter(Func<string, string> replace) { }

  public IEnumerable<string> Filter(IEnumerable<string> file) {
     foreach (string s in file) {
        yield return this.Replace(s);
     }
  }
}

そこから、デリゲート フィルターを直接使用するか、詳細のためにそれらをサブクラス化することができます。次に、それらを各フィルターを通過させるパイプラインに登録します。

于 2008-10-11T21:30:53.777 に答える
1

各ルールを適用する関数を作成し、各値に対して適用可能なすべての関数を呼び出すだけです。これがどのようにエキゾチックなアーキテクチャを必要とするのかわかりません。

于 2008-10-11T21:53:14.760 に答える
0

あなたはすべての異なる答えが彼ら自身の経験と視点から来ているのを見ることができます。

システムの複雑さと行数についてはよくわからないため、以前に行ったことに基づいてアドバイスを提供する傾向があります。

実装のソリューションを1/2に絞り込みたい場合は、詳細を入力してみてください。

幸運を

于 2008-10-11T17:53:20.923 に答える
0

それはあなたが聞きたいことではないかもしれませんし、決して「楽しい方法」ではありませんが、これを行うためのはるかに簡単な方法があります。

データが行ごとに評価される限り... Excel ファイルに別のワークシートを設定し、スプレッドシート スタイルの関数を使用して必要な変換を行い、生データ シートのデータを参照することができます。より複雑な関数については、Excel に埋め込まれた vba を使用してカスタム操作を書き出すことができます。

私はこのアプローチを何度も使用してきましたが、非常にうまく機能します。あまりセクシーではありません。

于 2008-10-13T16:06:11.683 に答える
0

各ルールのクラス?本当に?おそらく、私はこれらのルールの量や複雑さを理解していませんが、(半疑似コード):

public class ALine {
    private int col1;
    private int col2;
    private int coln;
    // ...

    public ALine(string line) {
         // read row into private variables
         // ...

         this.Process();
         this.Insert();
    }

    public void Process() {
         // do all your rules here working with the local variables
    }

    public void Insert() {
        // write to DB
    }
}

foreach line in csv
    new ALine(line);
于 2008-10-11T15:29:56.390 に答える
0

各ルールにクラスを使用する方法論は少し重く聞こえますが、新しいルールが登場した場合に簡単に変更および拡張できるという利点があります。

データのロードに関しては、一括ロードが適しています。insert ステートメントを使用してロードするよりも 3 桁も高速である可能性があることを示唆する情報を読みました。ここでいくつかの情報を見つけることができます

于 2008-10-11T15:33:14.340 に答える
0

データを一時テーブルに一括ロードし、SQL を使用してルールを適用します。実際のテーブルへの挿入の基礎として、一時テーブルを使用します。一時テーブルを削除します。

于 2008-10-11T15:35:59.437 に答える