如何使用必需的非空列设置文件管理器

时间:2012-04-18 09:24:32

标签: c# filehelpers

我一直在查看filehelpers文档,但似乎没有任何东西可以处理列中的空值。我需要能够在所有列上设置'非空'字符串属性。

有人能指出我正确的方向吗?

4 个答案:

答案 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