2012-01-03 8 views
0

大規模な区切りファイルを検証オブジェクトに効率的に解析するためにC#FileHelpersライブラリを使用しています。FileHelpersを複数の出力プロパティにマップする

しかし、1つの入力ファイルの列を複数の出力クラスプロパティにマップできますが、これを実現する明白な方法が見つかりません。私はITransformableを見てきましたが、操作中にメモリを減らすために別のオブジェクトにマップしたくないので、DynamicFieldBuilder/DynamicClassBuilderオブジェクトを見てきましたが、入力ファイル内で、出力インスタンスに何が含まれるべきではないかを示します。

私は、ファイルを2回読み込んだり、事実の後にある種のオブジェクトとオブジェクトのマッピングを行わないようにしたいと考えています。

入力ファイルの例:

ColumnA|ColumnB 
Foo|Baz 

出力クラス例:

public class FooBar 
{ 
    public string ColumnA_One; 
    public string ColumnA_Two; 
    public string ColumnB_One; 
    public string ColumnB_Two; 
} 
+0

。 。インデックスを作成するか、それらを順番にキャストする(int)、列挙型フィールド名 – MethodMan

+0

以下の私の例を見てください。私がしたいことではありません。上記の例のような単一の入力ファイルで、FooBarのインスタンスが生成され、ColumnA_OneとColumnA_Twoの両方が 'Foo'に等しく、ColumnB_OneとColumnB_Twoが 'Baz'に等しくなるようにします。 –

+0

はい、でもColumnA_Oneを見てみてください。あなたが望んでいるフィールド名は何ですか?私に送るか、私にすべてのフィールドのリストを表示して、私はあなたのためのenumの例を構築することができます。あなたが使用しているデリミタも私の例では5つの異なるファイルがenum構造を共有し、デリミタとしてカンマを持っています – MethodMan

答えて

1

あなたはFieldIgnored attributeと重複する列をマークし、それらを埋めるためにAfterReadRecord eventを使用することができます。あなたが列挙型を作成し、余分な列が同様に別の列挙型を作成し、このメイク感覚がないために列挙型は、列の順序を保持し、別のファイルがそのcoulunmを共有している場合が異なる順序でしまう場合は、これを行うことができます

class Program 
{ 
    [DelimitedRecord("|")] 
    public class FooBar 
    { 
     public string ColumnA_One;  
     [FieldIgnored] 
     public string ColumnA_Two;   

     public string ColumnB_One;   
     [FieldIgnored] 
     public string ColumnB_Two; 
    } 

    static void Main(string[] args) 
    { 
     FileHelperEngine engine = new FileHelperEngine(typeof(FooBar)); 
     engine.AfterReadRecord += engine_AfterReadRecord; 
     FooBar[] records = engine.ReadFile("FileIn.txt") as FooBar[]; 
    } 

    static void engine_AfterReadRecord(EngineBase engine, FileHelpers.Events.AfterReadEventArgs<object> e) 
    { 
     FooBar fooBar = e.Record as FooBar; 
     fooBar.ColumnA_Two = fooBar.ColumnA_One; 
     fooBar.ColumnB_Two = fooBar.ColumnB_One; 
    } 
} 
+0

これはうまくいきましたが、この方法を試しましたが、残念ながら処理が2回行われるためパフォーマンスが低下します。レコードを読み込むために1回、各行の後にもう一度データをコピーしてもう1つの列にコピーします。 –

+0

これは正解ですが、FileHelpersに[FieldRawValue]プロパティを含めるようにパッチを当てることになりました。慣習的に、この属性を持つプロパティは、前の列の変換されていない値で埋められます。 –

0
enum DataFields 
    { 
     Action = 0, 
     CRC = 1, 
     Desc = 2, 
     Group = 3, 
     Name = 4, 
     Sell = 5, 
     EffDate = 6, 
     Whse = 7, 
     Whse2 = 8, 
     Whse3 = 9, 
     Casepack = 10, 
     LDU = 11, 
     Cube = 12, 
     Item = 13, 
     UPC = 14, 
     Cost = 15, 
     Markup = 16, 
     OldSell = 17, 
     Avail = 18, 
     Substitute = 19, 
     Poll = 20 
    }//enum DataFields 

    /// <summary> 
    /// This will hold the ordinal position of the NameFields within the datafile 
    /// </summary> 
    enum NameFields 
    { 
     Code = 0, 
     Abrv = 1, 
     Name = 2, 
     Count = 3 
    }//enum NameFields 

    /// <summary> 
    /// This will hold the ordinal position of the values when populating the history table 
    /// </summary> 
    enum HistoryFields 
    { 
     CRC = 0, 
     EffDate = 1, 
     OldSell = 2, 
     Sell = 3 
    }//enum HistoryFields 
    #endregion  
関連する問題