簡體   English   中英

如何在使用filehelpers庫導入csv文件時修復ConvertException

[英]How do I fix a ConvertException while importing a csv file with the filehelpers library

我正在處理一個csv文件,由於用戶輸入錯誤,偶爾在int字段中有文本。 這是第一列,基本上它應該是一個獨特的記錄ID。 我正在使用engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;捕獲錯誤engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;

我寧願做的只是忽略錯誤並用我選擇的數值替換文本,並且仍然在處理結果中包含該行。

我甚至可以使用我在文件定義類文件中聲明的默認值: [FieldNullValue(typeof(int), "0")]

另一件事是我在運行時確定要解析的文件,如下所示:

Type t = assembly.GetType(assemblyName.Name + ".FileDefinitions." + className);  

FileHelperEngine engine = new FileHelperEngine(t);   

所以我不確定如何在<CustomersFixedWithNumericId>的內容中實現D.Lambert的建議所以澄清有7個不同的文件定義(類文件)上傳/處理,但所有這些都有CustomerId領域。

鑒於FileHelpers的當前狀態,您必須將該字段定義為字符串並嘗試對其進行自己的驗證。

我看了幾種不同的解決方法 - 首先,我嘗試使用屬性而不是字段來設置記錄。 可以想象,這可以讓您創建一個String屬性並驗證Set上的輸入。 事實證明這很困難,因為:

  • 屬性僅設置為目標字段(如果要修改FileHelpers代碼,則相當容易修復)。
  • 屬性的私有字段必須標記為w / [FieldNotInFile]屬性(煩惱)。
  • RecordInfo.CreateCoreFields()方法中不處理屬性。 這個更復雜一些,因為你真的必須以正確的順序創建屬性和字段的合並列表。 這是我停止研究這種方法的地方。

下一步計划:按原樣使用記錄定義,並在讀取期間進行驗證。 在引擎上設置事件處理程序:

    engine.AfterReadRecord += new Events.AfterReadHandler<CustomersFixedWithNumericId>(engine_AfterReadRecord);
    var res = engine.ReadFile(path);

然后處理處理程序中的錯誤值:

    void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<CustomersFixedWithNumericId> e)
    {
        int intVal;
        int.TryParse(e.Record.CustomerID, out intVal);
        e.Record.CustomerID = intVal.ToString();
    }

這些都不是完美的,但我認為第二個是相當接近的。

附錄:這顯示了上面使用后期類的技術:

public void TestMethod1()
{
    var assembly = System.Reflection.Assembly.GetExecutingAssembly();
    Type t = assembly.GetType("FileHelpers.Tests.CustomersFixedWithNumericId");
    FileHelperEngine engine = new FileHelperEngine(t);

    string path = @"pathtofile\BadCustomersFixedNumericId.txt";

    engine.AfterReadRecord += new Events.AfterReadHandler<object>(engine_AfterReadRecord);
    var res = engine.ReadFile(path);
}

void engine_AfterReadRecord(EngineBase engine, Events.AfterReadEventArgs<object> e)
{
    // validation here
}

暫無
暫無

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

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