18

以下のコードは、ASP.NETMVC2の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最初のレコードの場合は、イベントデータにプロパティを設定します。それが最後のレコードであるかどうかを判断するのは問題ですが、代わりに長さまたは形式を確認することもできます。もちろん、これにより、不正な形式のレコードによって引き起こされたエラーを検出できなくなります。

もう1つの可能性は、を使用してファイル全体をメモリにロードすることですFile.ReadAllLines。結果の配列から最初と最後の項目を削除し、それを文字列に戻し、ReadStringを呼び出します。MemoryStreamまたは、文字列をaに書き込んで、を呼び出すこともできます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 に答える