簡體   English   中英

FileHelpers - 當使用FieldQuoted屬性時,文件中的額外列不會引發錯誤

[英]FileHelpers - extra column in file not raising an error when FieldQuoted attribute used

使用FileHelpers.dll版本3.0.1.0,帶.net 4.0。

重現問題的代碼:

像這樣創建一個Accounts.txt文件:

"AccountName","ExtraColumn"
"MR GREEN ","abc"
"MR SMITH ","def"

c#帳戶類:

[IgnoreFirst(1)]
[DelimitedRecord(",")]
[IgnoreEmptyLines()]
public class Account
{
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    public string AccountName;

}

要閱讀文件:

        string fname = @"C:\test\Accounts.txt";

        FileHelperEngine engine = new FileHelperEngine(typeof(Account));

        Account[] importNodes =  (Account[])engine.ReadFile(fname);  // XX

現在,我原本期望在第XX行引發異常,因為文件(2)中的列比“Account”類(1)中的列多。 但是,沒有引發異常,並且額外的列似乎被忽略了。

如果更改Account類以刪除“FieldQuoted”屬性,則確實會引發異常,例如:

[FileHelpers.BadUsageException] {“Line:2 Column:0。Delimiter','在最后一個字段'AccountName'之后找到(文件錯誤或者你需要在記錄類中添加一個字段)”} FileHelpers.BadUsageException

誰能提供一些見解? 具有FieldQuoted屬性的代碼是否確實會引發異常? 難道我做錯了什么 ?

編輯 :是否有任何變通方法,以便當輸入文件中的列數多於預期時會引發錯誤?

[IgnoreFirst(1)]忽略文件的第一行,而不是第一列。

請參閱此處的說明: IgnoreFirstAttribute

刪除FieldQuoted會導致錯誤,因為如果沒有此屬性,則引用了無法正確處理的字段。

FileHelpers庫只是忽略文件中沒有類中相應字段的字段。

要忽略每行中的第一個字段,您只需在類定義中添加一個虛擬字段,如下所示:

[IgnoreFirst(1)]
[DelimitedRecord(",")]
[IgnoreEmptyLines()]
public class Account
{
   [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
   public string AccountName;

   [FieldValueDiscarded]
   [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
   public string Dummy;

}

作為一種解決方法,我可以建議在最后添加一個普通的string虛擬字段。 然后,您可以檢查FileHelperEngine.AfterReadRecord是否填寫了此字段,並拋出如下異常:

FileHelperEngine engine = new FileHelperEngine(typeof(Account));
engine.AfterReadRecord += engine_AfterReadRecord;
try
{
    Account[] importNodes = (Account[])engine.ReadFile(fname);  // XX
}
catch (Exception e)
{

}


static void engine_AfterReadRecord(EngineBase engine, FileHelpers.Events.AfterReadEventArgs<object> e)
{
    if (!string.IsNullOrEmpty(((Account) e.Record).Dummy))
    {
        throw new ApplicationException("Unexpected field");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM