2012-06-12 62 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; 
}; 
相关问题