如何在使用filehelpers库导入csv文件时修复ConvertException

时间:2011-03-26 19:19:39

标签: c# csv filehelpers

由于用户输入错误,我正在处理一个偶尔在int字段中有文本的csv文件。这是第一列,基本上它应该是一个独特的记录ID。我正在使用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字段。

1 个答案:

答案 0 :(得分:2)

鉴于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
}