18

下面的代码用于在 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[];
  }
4

3 回答 3

43

您可以使用这些属性

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

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

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

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

您可以稍后访问这些值

engine.HeaderText
engine.FooterText
于 2012-06-12T20:24:13.110 回答
3

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

另一种可能性是使用File.ReadAllLines. 从结果数组中删除第一项和最后一项,将其转回字符串,然后调用ReadString。或者您可以将字符串写入 aMemoryStream并调用ReadStream

于 2012-06-12T16:38:12.897 回答
1

最好的方法是使用 [IgnoreFirst] 属性来装饰您的班级。

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

var engine = new FileHelperEngine<T>();
engine.BeforeReadRecord += (e, args) =>
{
    if (args.LineNumber == 1)
        args.SkipThisRecord = true;
};
于 2018-02-02T18:22:00.067 回答