3

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

谁能指出我正确的方向?

4

4 回答 4

4

您可以在AfterReadRecord事件中执行您想要的任何验证。如果您想在出现错误的情况下继续处理文件的其余部分,您还需要ErrorModeSaveAndContinue. 请参阅下面的工作示例。

[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");
    }
}
于 2012-04-20T11:15:25.837 回答
3

默认情况下,一个空字符串将被解析为String.EmptyFileHelpers,但您可以使用自定义转换器覆盖它:

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为空或空白,则将其转换为null。

于 2012-04-20T09:32:16.620 回答
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));
        }
    }
}
于 2012-06-27T18:37:12.323 回答
2

对于我们的一个项目,我需要同样的东西,它大量使用 FileHelpers 并为提供新的FieldNotEmptyAttribute做出了贡献,它可以像这样使用:

[DelimitedRecord("|")]
public class MyClass
{
    [FieldNotEmpty()]
    public string Field1;
    public string Field2;
    [FieldNotEmpty()]
    public string Field3;
}

在上面的示例中,如果源文件中的 Field1 或 Field3 为空,则会引发ConvertException 。

于 2015-03-26T17:57:20.550 回答