我一直在查看filehelpers文档,但似乎没有任何东西可以处理列中的空值。我需要能够在所有列上设置'非空'字符串属性。
有人能指出我正确的方向吗?
答案 0 :(得分:4)
您可以在AfterReadRecord
事件中执行所需的任何验证。如果您希望在出现错误时继续处理文件的其余部分,则还需要将ErrorMode
设置为SaveAndContinue
。请参阅下面的工作示例。
[DelimitedRecord("|")]
public class MyClass
{
public string Field1;
public string Field2;
public string Field3;
}
class Program
{
static void Main(string[] args)
{
var engine = new FileHelperEngine<MyClass>();
engine.AfterReadRecord += new FileHelpers.Events.AfterReadHandler<MyClass>(engine_AfterReadRecord);
engine.ErrorMode = ErrorMode.SaveAndContinue;
// import a record with an invalid Email
MyClass[] validRecords = engine.ReadString("Hello||World");
ErrorInfo[] errors = engine.ErrorManager.Errors;
Assert.AreEqual(1, engine.TotalRecords); // 1 record was processed
Assert.AreEqual(0, validRecords.Length); // 0 records were valid
Assert.AreEqual(1, engine.ErrorManager.ErrorCount); // 1 error was found
Assert.That(errors[0].ExceptionInfo.Message == "Field2 is invalid");
}
static void engine_AfterReadRecord(EngineBase engine, FileHelpers.Events.AfterReadEventArgs<MyClass> e)
{
if (String.IsNullOrWhiteSpace(e.Record.Field1))
throw new Exception("Field1 is invalid");
if (String.IsNullOrWhiteSpace(e.Record.Field2))
throw new Exception("Field2 is invalid");
if (String.IsNullOrWhiteSpace(e.Record.Field3))
throw new Exception("Field3 is invalid");
}
}
答案 1 :(得分:3)
默认情况下,在FileHelpers中将空字符串解析为String.Empty
,但您可以使用自定义转换器覆盖它:
public class EmptyStringConverter : ConverterBase
{
public override object StringToField(string sourceString)
{
if (String.IsNullOrWhiteSpace(sourceString))
return null;
return sourceString;
}
}
然后你定义你的记录类属性
[FieldConverter(typeof(EmptyStringConverter))]
public string Field1;
如果与Field1
对应的字符串为空或空白,则将其转换为空。
答案 2 :(得分:2)
使用转换器不起作用,因为FileHelpers.FieldBase
检查零长度字段,并在调用转换器之前返回Null。
使用public static FileHelperEngine GetEngine()
可确保正确连接AfterReadRecord
事件验证。
[DelimitedRecord(",")]
public class RequiredField
{
public string Required;
public static FileHelperEngine GetEngine()
{
var result = new FileHelperEngine(typeof(RequiredField));
result.AfterReadRecord += AfterReadValidation;
return result;
}
private static void AfterReadValidation(EngineBase sender, AfterReadRecordEventArgs args)
{
if (String.IsNullOrWhiteSpace(((RequiredField)args.Record).Required))
{
throw new ConvertException("RequiredField is Null or WhiteSpace", typeof(String));
}
}
}
答案 3 :(得分:2)
对于我们的一个项目来说,我需要大量使用FileHelpers并提供新的FieldNotEmptyAttribute,这可以像这样使用:
[DelimitedRecord("|")]
public class MyClass
{
[FieldNotEmpty()]
public string Field1;
public string Field2;
[FieldNotEmpty()]
public string Field3;
}
在上面的示例中,如果源文件中的Field1或Field3为空,则抛出ConvertException。