2012-01-11 4 views
7

He descargado FileHelpers desde nuget pero no estoy seguro de si esta característica no existe o si no tengo la versión correcta o qué.¿Hay alguna manera de hacer un pedido de campo usando la biblioteca FileHelpers?

He estado looking around y parece que FileHelpers puede tener un atributo para especificar el orden de los campos.

He descargado this one sin embargo cuando yo estaba buscando en Nuget parece que hay another version

+0

Según el código en el repositorio bitbucket, parece que 'FieldOrderAttribute' ha estado allí desde el 03/02/2010, que es ** mucho ** anterior al paquete que ha instalado. –

+0

También el más activo [repositorio de SourceForge] (http://filehelpers.svn.sourceforge.net/viewvc/filehelpers/trunk/FileHelpers/Attributes/FieldOrderAttribute.cs?view=log) muestra que el archivo existe desde al menos marzo de 2010 –

+0

¿Entonces los nuget están desactualizados entonces? – chobo2

Respuesta

8

En primer lugar, el atributo FieldOrder no existe en FileHelpers 2.0. En FileHelpers 2.9.9 (también disponible a través de NuGet), el atributo existe, pero si lo especifica para cualquier campo, debe especificarlo para todos los campos. En general, sin embargo, el uso del atributo no es necesario, ya que el orden de los campos está definido por el formato.

Al utilizar FileHelpers usted proporciona una clase para describir su formato, por ejemplo,

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

    // Second field 
    public string CustomerID; 

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

Esto describe un formato con tres campos, separados por barras verticales. Si lo desea, es la especificación del formato. Una vez definido que se puede utilizar para importar y exportar:

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); 

Por lo tanto, si desea que sus campos en un orden diferente, debe modificar su clase Order.

Ahora si realmente querían, (con FileHelpers 2.9.9), se puede cambiar el orden de los campos de la siguiente manera:

[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;  
} 

pero es más limpio para evitar el uso del atributo y FieldOrder modifique el orden de los campos dentro de la clase en su lugar.

Por otro lado, si necesita especificar el orden de los campos en tiempo de ejecución, debe compilar la clase Order utilizando runtime records. Puede utilizar un string

Type orderType = ClassBuilder.ClassFromString(stringContainingOrderClassInCSharp); 

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

O puede utilizar una 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[]; 

Usted puede usar cualquier lógica te gusta con el fin de añadir sus campos en el orden necesario.

+0

¿Cuál es la diferencia? FileHelpers 2.9.9 - Esta versión parece faltar este atributo "FieldTitle" (lo que estaba en uno de los enlaces que yo también vinculo) – chobo2

+1

FileHelpers 2.0.0.0 se desarrolló entre 2005 y 2007 y es estable y tiene mucha documentación. La versión más reciente 2.9.9 tiene menos documentación y no estoy seguro de cuáles son las nuevas características. 'FieldTitle' ha sido reemplazado por una propiedad' engine.HeaderText' que puede establecer como se explica en [la respuesta a su publicación vinculada] (http://stackoverflow.com/a/4827625/1077279) – shamp00

+0

También estaba mirando su código y se dio cuenta de que no usaba propiedades. ¿No puedes usar propiedades? Veo que las propiedades automáticas no funcionan con FieldOrder – chobo2

Cuestiones relacionadas