FileHelpers: cómo omitir la primera y última línea leyendo texto de ancho fijo

El siguiente código se usa para leer el archivo de texto de contenido de archivo cargado de ancho fijo usando FileHelpers en ASP .NET MVC2

Las longitudes de la primera y la última línea son más pequeñas y ReadStream causa una excepción debido a esto. Todas las demás líneas tienen el ancho fijo adecuado. ¿Cómo omitir la primera y la última línea u otra forma 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[];
  }

preguntado el 12 de junio de 12 a las 17:06

3 Respuestas

Puedes usar estos atributos

IgnorarPrimero: Indica el número de líneas que se ignorarán al comienzo de un archivo o secuencia cuando el motor lo lea.

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

Ignorar último: indica el número de líneas que se ignorarán al final de un archivo o secuencia cuando el motor lo lea.

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

Puede acceder a los valores más tarde con

engine.HeaderText
engine.FooterText

Respondido el 12 de junio de 12 a las 21:06

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 siempre contiene "VV" al comienzo de cada línea. ¿Cómo examinar el flujo antes de leer y aplicar un modo de lectura diferente según el formato? - Andrus

motor.Opciones.IgnorarPrimerasLíneas = 1 - héroe cero

Podrías usar el BeforeReadRecord evento para comprobar el formato de la línea. Selecciona el SkipThisRecord propiedad en los datos del evento si es el primer registro. Determinar si es el último registro es un problema, pero podría verificar la longitud o el formato en su lugar. 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 el primer y el último elemento de la matriz resultante, vuelva a convertirlo en una cadena y luego llame LeerCadena. O puede escribir las cadenas en un MemoryStream y llama ReadStream.

Respondido el 13 de junio de 17 a las 14:06

404s en ambos enlaces. - solo Steve

@justSteve: Enlaces rotos arreglados. La documentación de FileHelpers está en filehelpers.net/docs/html/R_Project_FileHelpers.htm - jim mischel

lo mejor es decorar tu clase con el atributo [IgnorarPrimero].

Si por alguna razón no puede agregar el atributo, puede hacer algo como esto

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

Respondido 02 Feb 18, 18:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.