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