2012-06-12 9 views
13

código de abajo se utiliza para leer el archivo de texto el contenido del archivo subido ancho fijo utilizando FileHelpers en ASP .NET MVC2FileHelpers: Cómo omitir primera y última línea de la lectura de texto de ancho fijo

Primera y última longitudes de línea son más pequeñas y causas ReadStream excepción debido a esto. Todas las demás líneas tienen un ancho fijo adecuado. ¿Cómo saltear las primeras y las últimas líneas u otras formas de leer datos sin excepción?

[FixedLengthRecord()] 
    class Bank 
    { 
     [FieldFixedLength(4)] 
     public string AINETUNNUS; 
     [FieldFixedLength(16)] 
     public string TEKST1; 
     [FieldFixedLength(3)] 
     public string opliik; 
     [FieldFixedLength(2)] 
     public string hinnalis; 
    }; 

    [AcceptVerbs(HttpVerbs.Post)] 
    [Authorize] 
    public ActionResult LoadStatement(HttpPostedFileBase uploadFile) 
    { 

     FileHelperEngine engine = new FileHelperEngine(typeof(Bank)); 
     var res = engine.ReadStream(new StreamReader(uploadFile.InputStream, 
      Encoding.GetEncoding(1257))) as Bank[]; 
    } 

Respuesta

31

Puede utilizar estos atributos

IgnoreFirst: Indica el número de líneas para ser ignorado en el comienzo de un archivo o una corriente cuando el motor leyó.

[IgnoreFirst(1)] 
public class OrdersVerticalBar 
{ ... 

IgnoreLast: Indica el número de líneas a ser ignorados al final de un archivo o una secuencia cuando el motor leyó.

[IgnoreLast(1)] 
public class OrdersVerticalBar 
{ ... 

Puede acceder a los valores más tarde con

engine.HeaderText 
engine.FooterText 
+0

Gracias. En realidad, los archivos pueden estar en dos formatos diferentes: ancho fijo como se describe en la pregunta y en formato de registro donde cada campo está en una línea separada. Los campos también son diferentes en ambos formatos, por lo que se deben usar dos modos de lectura diferentes. El formato de ancho fijo contiene siempre "VV" en el inicio de cada línea. ¿Cómo examinar el flujo antes de leer y aplicar un modo de lectura diferente según el formato? – Andrus

+0

Cómo Ignorar Primero/Ignorar ¿Más bajo demanda en lugar de en Clase? – zerohero

+1

engine.Options.IgnoreFirstLines = 1 – zerohero

3

Se podría utilizar el evento BeforeReadRecord para comprobar el formato de la línea. Establezca la propiedad SkipThisRecord en los datos del evento si es el primer registro. Determinar si es el último registro es algo problemático, pero en su lugar puede verificar la longitud o el formato. Por supuesto, eso evitará que detecte errores causados ​​por registros mal formados.

Otra posibilidad es cargar todo el archivo en la memoria usando File.ReadAllLines. Elimine los elementos primero y último de la matriz resultante, vuélvalo a convertir en una cadena y luego llame al ReadString. O puede escribir las cadenas en MemoryStream y llamar al ReadStream.

+0

404 en ambos enlaces. – justSteve

+1

@justSteve: enlaces rotos corregidos. La documentación de FileHelpers está en http://www.filehelpers.net/docs/html/R_Project_FileHelpers.htm –

0

lo mejor es decorar su clase con el atributo [IgnoreFirst].

Si por alguna razón no se puede añadir el atributo que se puede hacer algo como esto

var engine = new FileHelperEngine<T>(); 
engine.BeforeReadRecord += (e, args) => 
{ 
    if (args.LineNumber == 1) 
     args.SkipThisRecord = true; 
}; 
Cuestiones relacionadas