2012-06-12 2 views
13

codice di seguito viene utilizzata per leggere file di testo il contenuto del file caricato larghezza fissa utilizzando FileHelpers in ASP .NET MVC2FileHelpers: come ignorare prima e ultima linea la lettura del testo a larghezza fissa

Prima e lunghezze ultima linea sono più piccoli e le cause ReadStream eccezione dovuta a questo. Tutte le altre linee hanno una larghezza fissa adeguata. Come saltare la prima e l'ultima riga o altro modo di leggere i dati senza eccezioni?

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

risposta

31

È possibile utilizzare questi attributi

IgnoreFirst: Indica il numero di linee per essere ignorati all'inizio di un file o di streaming quando il motore lo lesse.

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

IgnoreLast: indica il numero di linee da ignorare alla fine di un file o flusso quando il motore lo lesse.

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

È possibile accedere ai valori più tardi con

engine.HeaderText 
engine.FooterText 
+0

Grazie. In realtà i file possono essere in due formati diversi: larghezza fissa come descritto nella domanda e in formato record in cui ogni campo è in una riga separata. I campi sono anche diversi nei due formati, quindi dovrebbero essere utilizzate due diverse modalità di lettura. Il formato a larghezza fissa contiene sempre "VV" all'inizio di ogni riga. Come esaminare lo stream prima di leggere e applicare una modalità di lettura diversa a seconda del formato? – Andrus

+0

Come ignorarePrima/IgnoraLast su richiesta anziché in Classe? – zerohero

+1

engine.Options.IgnoreFirstLines = 1 – zerohero

3

È possibile utilizzare l'evento BeforeReadRecord per controllare il formato della linea. Impostare la proprietà SkipThisRecord nei dati dell'evento se si tratta del primo record. Determinare se si tratta dell'ultimo record è un problema, ma è sufficiente controllare la lunghezza o il formato. Ovviamente, questo ti impedirà di intercettare errori causati da record non validi.

Un'altra possibilità è caricare l'intero file in memoria utilizzando File.ReadAllLines. Rimuovere il primo e l'ultimo elemento dall'array risultante, reinserirlo in una stringa e quindi chiamare ReadString. O potresti scrivere le stringhe a MemoryStream e chiamare ReadStream.

+0

404s su entrambi i collegamenti. – justSteve

+1

@justSteve: collegamenti interrotti corretti. La documentazione di FileHelpers è disponibile all'indirizzo http://www.filehelpers.net/docs/html/R_Project_FileHelpers.htm –

0

il migliore è quella di decorare la classe con l'attributo [IgnoreFirst].

Se per qualche motivo non è possibile aggiungere l'attributo che si può fare qualcosa di simile

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