FileHelpers:如何跳过读取固定宽度文本的第一行和最后一行

时间:2012-06-12 16:27:08

标签: c# asp.net-mvc filehelpers

下面的代码用于在ASP .NET MVC2中使用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[];
  }

3 个答案:

答案 0 :(得分:37)

您可以使用这些属性

IgnoreFirst :表示引擎在读取文件或流时开始时忽略的行数。

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

IgnoreLast :表示引擎读取文件或流末尾时要忽略的行数。

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

您可以稍后使用

访问这些值
engine.HeaderText
engine.FooterText

答案 1 :(得分:3)

您可以使用BeforeReadRecord事件来检查该行的格式。如果事件数据是第一条记录,请在事件数据中设置SkipThisRecord属性。确定它是否是最后一条记录是一个问题,但您可以只检查长度或格式。当然,这会阻止您捕获由格式错误的记录引起的错误。

另一种可能性是使用File.ReadAllLines将整个文件加载到内存中。从结果数组中删除第一个和最后一个项目,将其重新转换为字符串,然后调用ReadString。或者您可以将字符串写入MemoryStream并致电ReadStream

答案 2 :(得分:0)

最好的方法是使用[IgnoreFirst]属性来装饰你的类。

如果由于某种原因你无法添加属性,你可以做这样的事情

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