2012-06-12 58 views
13

代碼下面是用來在ASP .NET MVC2使用FileHelpers讀取固定寬度上載的文件的內容的文本文件FileHelpers:如何跳過第一行和最後一行讀取固定寬度的文本

第一行和最後一行的長度更小,原因ReadStream由於這個例外。 所有其他線都有適當的固定寬度。 如何跳過第一行和最後一行或以其他方式無一例外地讀取數據?

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

回答

31

您可以使用這些屬性

IgnoreFirst

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

IgnoreLast:指示行的編號,以在文件的結尾被忽略或當發動機讀取它流。

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

以後,您可以用

engine.HeaderText 
engine.FooterText 
+0

謝謝。實際上,文件可以採用兩種不同的格式:固定寬度,如問題描述和記錄格式,其中每個字段位於不同的行中。兩種格式的字段也不同,因此應使用兩種不同的讀取模式。固定寬度格式在每行的開始處總是包含「VV」。如何在閱讀之前檢查流,並根據格式應用不同的閱讀模式? – Andrus

+0

如何根據需要忽略首先/忽略最後而不是在類中? – zerohero

+1

engine.Options.IgnoreFirstLines = 1 – zerohero

3

您可以使用BeforeReadRecord事件來檢查行的格式。如果它是第一條記錄,請在事件數據中設置SkipThisRecord屬性。確定它是否是最後一個記錄是有問題的,但是您可以僅檢查長度或格式。當然,這會阻止你捕捉由格式錯誤的記錄引起的錯誤。

另一種可能性是使用File.ReadAllLines將整個文件加載到內存中。從結果數組中刪除第一個和最後一個項目,將其重新轉換爲字符串,然後致電ReadString。或者您可以將字符串寫入MemoryStream並致電ReadStream。在文件的開頭指示線的數量被忽略或者當發動機閱讀流:

+0

404。 – justSteve

+1

@justSteve:破損的鏈接已修復。 FileHelpers文檔位於http://www.filehelpers.net/docs/html/R_Project_FileHelpers.htm –

0

最好是用[IgnoreFirst]屬性來裝飾你的類訪問值。

如果由於某種原因,你不能添加屬性,你可以這樣做兩個環節此

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