8

FileHelpers を nuget からダウンロードしましたが、この機能が存在しないのか、適切なバージョンを持っていないのか、それとも何なのかわかりません。

私は周りを見回しており、FileHelpers にはフィールドの順序を指定する属性があるようです。

これをダウンロードしましたが、ナゲットを探していたときに別のバージョンがあるようです

4

1 に答える 1

9

まず、FileHelpers 2.0 には FieldOrder 属性がありません。FileHelpers 2.9.9 (NuGet からも入手可能) には、属性が存在しますが、任意のフィールドに指定する場合は、すべてのフィールドに指定する必要があります。ただし、フィールドの順序はフォーマットによって定義されるため、通常は属性を使用する必要はありません。

FileHelpers を使用する場合、フォーマットを記述するクラスを提供します。

[DelimitedRecord("|")] 
public class Order 
{ 
   // First field
   public int OrderID; 

   // Second field
   public string CustomerID; 

   // Third field
   [FieldConverter(ConverterKind.Date, "ddMMyyyy")]   
   public DateTime OrderDate;    
}

これは、縦棒で区切られた 3 つのフィールドを持つ形式を表しています。よろしければフォーマット仕様です。定義したら、それを使用してインポートおよびエクスポートできます。

FileHelperEngine engine = new FileHelperEngine(typeof(Order)); 

// To read use: 
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

// To write use: 
engine.WriteFile("FileOut.txt", orders); 

したがって、フィールドを別の順序で並べたい場合は、Orderクラスを変更する必要があります。

本当に必要な場合は (FileHelpers 2.9.9 で)、次のようにフィールドの順序を変更できます。

[DelimitedRecord("|")] 
public class Order 
{ 
   // Third field
   [FieldOrder(3)]
   public int OrderID; 

   // Second field
   [FieldOrder(2)]
   public string CustomerID; 

   // First field
   [FieldOrder(1)]
   [FieldConverter(ConverterKind.Date, "ddMMyyyy")]   
   public DateTime OrderDate;    
}

ただし、属性の使用を避け、FieldOrder代わりにクラス内のフィールドの順序を変更する方がクリーンです。

一方、実行時にフィールドの順序を指定する必要がある場合は、ランタイム レコードOrderを使用してクラスをビルドする必要があります。あなたが使用することができますstring

Type orderType = ClassBuilder.ClassFromString(stringContainingOrderClassInCSharp); 

FileHelperEngine engine = new FileHelperEngine(orderType); 
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

または、次を使用できますClassBuilder

DelimitedClassBuilder cb = new DelimitedClassBuilder("Order");
// First field
cb.AddField("OrderID", typeof(int));
// Second field
cb.AddField("CustomerID", 8, typeof(string));
// Third field
cb.AddField("OrderDate", typeof(DateTime));
cb.LastField.Converter.Kind = ConverterKind.Date; 
cb.LastField.Converter.Arg1 = "ddMMyyyy";

engine = new FileHelperEngine(cb.CreateRecordClass());
Order[] orders = engine.ReadFile("FileIn.txt") as Order[]; 

必要な順序でフィールドを追加するために、好きなロジックを使用できます。

于 2012-01-12T10:13:05.637 に答える