1

テキスト ファイルの解析に FileHelper ライブラリを使用しようとしています。最終的にデータはデータベースに保存されます。テキスト ファイルに位置レコードが含まれています。レコードの最初の 2 文字は、レコードの階層内の位置を定義します。ファイルは次の順序で並べられています。

  • 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個の第3レベルデータ
        • 40、50、60 の繰り返しシーケンス。
    • 20 第 2 レベルのデータ
      • 20、40、50、60 の繰り返しシーケンス...

今、私は 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 ベースであり、アーキテクトによって拒否されました)。

前もって感謝します。

4

2 に答える 2

1

FileHelpers は、複雑なフォーマット用に実際には設計されていません。行ごとに個別のフォーマットを定義し、行頭に基づいてすべてを解析すれば、 MultiRecord エンジンをうまく利用できるかもしれませんが、子レコードを親レコードにリンクするのは難しいでしょう。

あなたの最善のアプローチは、手動でコーディングすることだと思います。何かのようなもの

  1. 行ごとに読み取ります
  2. 各行をフィールドに分割
  3. マスターラインなら詳細ラインを読む
  4. 詳細行が詳細のマスターである場合は、それらの行を読んでください...など。

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

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

于 2012-03-29T14:21:52.700 に答える