由于用户输入错误,我正在处理一个偶尔在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字段。
答案 0 :(得分:2)
鉴于FileHelpers的当前状态,您必须将该字段定义为字符串并尝试对其进行自己的验证。
我看了几种不同的解决方法 - 首先,我尝试使用属性而不是字段来设置记录。可以想象,这可以让您创建一个String属性并验证Set上的输入。事实证明这很困难,因为:
下一个计划:按原样使用记录定义,并在读取期间进行验证。在引擎上设置事件处理程序:
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
}