2012-03-28 13 views
1

テキストファイルの解析にFileHelperライブラリを使用しようとしています。最終的にデータはデータベースに格納されます。テキストファイルには位置情報が含まれています。レコードの最初の2文字は、レコードの階層内の位置を定義します。 ファイルは以下のように順序付けされる:FileHelperライブラリを使用してnレベル階層の位置レコードファイルを解析する

  • 10共通データ(10-19全てが同じレベルを有する)
    • 20第2のレベルのデータ(20-29が同じレベルを有する)
      • 30個の第3レベルデータ(30-39が同じレベルを有する)
        • 40 4レベルデータ
          • 50レベル5データ
            • 60最終レベルのデータ
            • 60最終レベルのデータ
          • 50レベル5のデータ
            • 60最終レベルのデータ
            • 60最終レベルのデータ
        • 40 4レベルデータ
          • 50のレベル5データ
            • 60最終レベルデータ
            • 60最終レベルデータ
          • 50レベル5データ
            • 60最終レベルデータ
            • 60最終レベルデータ
      • 30 20、40、50、60の配列を繰り返し40、50、60 ..
  • 20第2レベルのデータ
    • の第3レベルデータが
      • 反復配列..と私は今ように...

FileHelperのMaster-Detailコンセプトを使用しようとしていますが、Master-Detailの1つのレベルでのみ動作すると思います。関連するテーブルを埋めるために使用できるデータの階層を作成するために使用できますか?すべてのレコードは固定長レコードなので問題はありません。

注意:レコード間には主キーと外部キーの関係はありません。位置とレコード番号は、誰が親(マスター)であり、誰が子供(詳細)であるかを示します。

サンプル日付は以下の通りである:

10R 420120320F 20120320212045 16 
11F FFuture    
11C OCall     
11P OPut     
12CADCanadian Dollars  0 
12CHFSwiss Francs   0 
12CZKCzech Republic Korun 0 
12DEMGerman Marks   0 
12DKKDanish Krone   0 
12ESBSpanish Pesatas  3 
12EUREuropean currency Un 0 
12FIMFinnish Mark   0 
14  1 20.0000 100 2O UKX 1A 1L Z 1B 1 
14  2 20.0000 100 2L EFE 1A 1O EFE 1B 1 
14  3 20.0000 100 2L EFP 1A 1O EFP 1B 1 
14  4 20.0000 100 2L CCI 1A 1O CCI 1B 1 
14  5 20.0000 100 2L AXI 1A 1O AXI 1B 1 
14  6 20.0000 100 2L BLI 1A 1O BLI 1B 1 
15 1F+0, VOL+  2 
15 2F+0, VOL-  1 
15 3F+1/3, VOL+  4 
15 4F+1/3, VOL-  3 
15 5F-1/3, VOL+  6 
15 16F-EXTREME  16 
16EQYLIFFE Equities   
16IPEIntl. Petroleum Exchange 
16LCPLIFFE Commodity Products 
16LIFLIFFE Financials   
16LIGLIFFE OTC     
16LMELME Metals    
20L LIFFE F 
30AXIAEX Index    EQYEUR2.000.3500  10 110 1   
31 1 10000000099999999 
32 1  220 2 1 1A 1 1B 
34 1 1 1 1 
40ZAXFAEX Index Future EUR 10000 10  0.02000 1.00  0  0 2000002 
50201204000.0000000.25000.2500 120120400 
60  0F  1 3308420 1.0000  0  0 -66667 -66667 66667 66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000 
50201205000.0000000.25000.2500 120120500 
60  0F  1 3262910 1.0000  0  0 -66667 -66667 66667 66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000 
50201206000.0000000.25000.2500 120120600 
60  0F  1 3258970 1.0000  0  0 -66667 -66667 66667 66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000 
40I OTHREE MONTH EURO (EUEUR 10000 25  0.25000 1.00  3 1000 32002 
50201204000.0000000.35000.3500 120120600 
60 97750C  1 16000 1.0000  0  0 -1067 -1067 1067 1067 -2133 -2133 2133 2133 -3200 -3200 3200 3200 -2240 2240 
60 97750P  1  0 0.0000  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
60 97875C  1 14750 1.0000  0  0 -1067 -1067 1067 1067 -2133 -2133 2133 2133 -3200 -3200 3200 3200 -2240 2240 
60 97875P  1  0 0.0000  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 
30L 3 Month Pound Sterli LIFGBP2.000.3500   11010 1   
31 6 10000000020120600 22012090020121200 32013030020131200 42014030020141200 52015030020151200 62016030099999999 
32 1  50 2 2 1A 2 1B 
32 2  55 2 1 1A 1 1B 
32 21  290 2 6 1A 6 1B 
34 2 1 1 3 2 4 6 

誰がこれを解析するFileHelperまたは他のライブラリや、いくつかのアルゴリズムを使用する方法で私を導くことができるしてください。 XMLを使用することはファイルサイズが大きい(100 Mb)ので問題になる可能性があります。そのため、非XMLベースのアプローチ(私の以前のアプローチはXMLベースであり、建築家によって拒否されました)を好むでしょう。

ありがとうございます。

答えて

1

FileHelpersは実際には複雑なフォーマット用に設計されていません。各行に個別の書式を定義し、行の先頭に基づいてそれらをすべて解析すると、MultiRecord engineのどこかにあるかもしれませんが、子レコードを親レコードとリンクするのは難しいでしょう。

私はあなたの最善のアプローチは手動でコード化することだと思います。

  1. 1行あたりで読む
  2. スプリットような何か分野
  3. に、各ラインにはmaster行である場合は、詳細なラインは、さらに詳細のためのマスターである場合は詳細行
  4. に読み、それらを読んで行など...

ファイルサイズが大きい場合は、解析された部分をデータベースのどこかに保存せずに全体を処理しないでください。

CSV文法の解析を処理するための興味深いアプローチがいくつかあります。 Linqを使用すると、解析に問題があるときに非常に役立つエラーメッセージが表示されなくなります。あるいは、hereのようにExpandoObjectsを使用することもできます。別の方法は、Spracheのようなパーサジェネレータを使用することです。いずれにせよ、これらのアプローチは、ファイル全体を処理しようとするとメモリの問題に遭遇する可能性があります。私のアドバイスは、個々の行を解析するためにそれらを考慮することです。

+0

これを確認していただきありがとうございます。 ファイルヘルパー(マルチレコードエンジン)で2日を過ごした後、それを理解しました。だから、私はあなたに言及したのと同じような何かを追っている。 1.行ごとに読み取る 2.オブジェクトの階層を作成します(レコードタイプごとに1つのクラス) 3。行のフィールドを解析する責任は個々のクラスに任せてください。 4.フィールドをデータベースに保存してから自分自身を廃棄するために、(各クラスごとに)何らかのインターフェイスを実装します。 5.子供がセーブする前に親がセーブすることをチェックするだけですが、すべての子がセーブを完了したら処分します。 – Darsin

-1
  1. アプローチあなたは、これが一般的な考え方

  2. 分割されている正規表現を使用してファイルを解析し、

    2.1勝つことができます。ラインで分割

    2.2。行を単語で分割します。あなたはどんなフォーマットを期待しているのかを知っています。

    2.3。 2.2が十分でない場合は、データを取得するための行の正規表現を適用します。

    2.4。 2.3で十分でない場合は、地域、ヘッダー、財務情報1、財務情報2、使用する2.1と2.2を使用して状態を保存して、必要なルールを適用するためにこの状態を使用します。

関連する問題