フラットファイル処理に適切なデータ構造ですか?
-
08-07-2019 - |
質問
本質的に、データベースにフラットファイルを取得する必要があります。フラットファイルには、各行の最初の2文字が記録の種類を示しています。
レコード内のフィールドに一致するプロパティを持つレコードタイプごとにクラスを作成しますか?配列を使用するだけですか?
データをデータベースに保存する前に何らかのデータ構造にデータをロードして、ユニットテストを使用してデータが正しくロードされたことを確認できるようにします。
これは、私が取り組まなければならないもののサンプルです(BAI2銀行取引明細書):
01,121000358,CLIENT,050312,0213,1,80,1,2/
02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/
03,600812345678,GBP,fab1,111319005,,V,050314,0000/
88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/
88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/
88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/
16,169,57626223,V,050311,0000,102 0101857345,/
88,LLOYDS TSB BANK PL 779300 99129797
88,TRF/REF 6008ABS12300015439
88,102 0101857345 K BANK GIRO CREDIT
88,/IVD-11 MAR
49,1778372829,90/
98,1778372839,1,91/
99,1778372839,1,92
解決
クラス(または構造体、または言語がサポートする値タイプ)を作成することをお勧めします。
record.ClientReference
より説明的です
record[0]
そして、(素晴らしい!) FileHelpers Library を使用している場合、用語はきれいです。あなたのために非常に口述。
他のヒント
検証ロジックには通常少なくとも2つのレベルがあり、グロスレベルは「適切にフォーマットされた」レベルです。より細かいレベルは「正しいデータ」です。
ここにはいくつかの個別の問題があります。 1つの問題は、単純にデータを検証するか、解析が正確であることを確認するテストを作成することです。これを行う簡単な方法は、指定された値の範囲を受け入れ、適切でない場合は適切なエラーをスローするクラスに解析することです。 例えば
public void setField1(int i) { if(i> 100)throw new InvalidDataException ... }
各レコードタイプに異なるクラスを作成することは、コードごとに解析ロジックが大幅に異なる場合に行うことができるため、
のような条件付きロジックはありません。 public void setField2(String s)
{
if (field1==88 && s.equals ...
else if (field2==22 && s
}
yechh。
過去にこの種のデータをロードする必要があったとき、1つのフィールドに最初の2文字を、別のフィールドに残りの文字を含む作業テーブルにすべてを入れました。次に、最初の2文字に基づいて適切な他の作業テーブルに解析しました。次に、2番目の作業テーブルのセットからデータベースにデータを挿入する前に、クリーンアップと検証を行いました。
SQL Serverでは、DTS(2000)またはSSISパッケージを介してこれを行うことができ、SSISを使用して、最初に作業テーブルに格納してオンザフライでデータを処理できる場合がありますが、プロセスは微妙です。 2文字を使用して、使用するデータフローブランチを決定し、レコードの残りを何らかの保持メカニズムに解析し、挿入する前にクリーンアップおよび検証します。他のデータベースにもデータをインポートするための何らかのメカニズムがあり、同様のプロセスを使用するはずです。
データ形式に何らかの複雑性がある場合は、データを解析して保持し、検証を実行し、他の適切なモデルタスクを実行するカスタムクラスのセットを作成する必要があることに同意します(たとえば、人間が読める説明を返します、一部の人は、これは別のビュークラスに入れる方が良いと主張しますが)。これはおそらく、継承を使用するのに適した状況です。親クラス(おそらく抽象)がすべてのタイプのレコードに共通のプロパティとメソッドを定義し、各子クラスが必要に応じてこれらのメソッドをオーバーライドして独自の解析と検証を提供できます、または独自のプロパティとメソッドを追加します。
各タイプの行にクラスを作成する方が、配列を使用するよりも優れたソリューションです。
しかし、それは過去に、ハッシュテーブルの配列リストを使用して同じことを達成したことです。 arraylistの各項目は行であり、hashtableの各エントリは列名とセル値を表すキー/値のペアです。
データを保持するデータベースの設計から始めて、エンティティフレームワークを使用してクラスを生成することができます。
これは奇抜なアイデアです:
Perlで作業している場合は、 DBDを使用できます。 :: CSV を使用して、フラットファイルからデータを読み取ります。ただし、区切り文字とEOL文字に正しい値を指定している必要があります。次に、SQLステートメントを使用してフラットファイルから行を読み取ります。 DBIはそれらを標準のPerlデータ構造に変換し、任意の検証ロジックを実行できます。各行がすべての検証テストに合格すると、DBD :: whateverを使用して宛先データベースに書き込むことができます。
-steve