3

我正在处理一个 csv 文件,由于用户输入错误,该文件偶尔会在 int 字段中包含文本。它是第一列,基本上它应该是一个唯一的记录 ID。我正在使用engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;

我宁愿做的只是忽略错误并用我选择的数值替换文本,并且仍然将该行包含在处理后的结果中。

我什至可以只保留我在文件定义类文件中声明的默认值的过程: [FieldNullValue(typeof(int), "0")]

另一件事是我正在确定在运行时要解析的文件,如下所示:

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

FileHelperEngine engine = new FileHelperEngine(t);   

因此,我不确定如何在输入内容的上下文中实施 D.Lambert 的建议,<CustomersFixedWithNumericId>以便澄清有 7 个不同的文件定义(类文件)可以上传/处理,但它们都有 CustomerId 字段。

4

1 回答 1

2

鉴于 FileHelpers 的当前状态,您确实必须将该字段定义为字符串并尝试对其进行自己的验证。

我研究了几种不同的方法来解决这个问题——首先,我尝试使用属性而不是字段来设置记录。可以想象,这可以让您创建一个 String 属性并验证 Set 上的输入。事实证明这很困难,因为:

  • 属性仅设置为目标字段(如果您想修改 FileHelpers 代码,这很容易修复。
  • 必须使用 [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
}
于 2011-03-30T18:52:14.297 回答