C# 如何使用必填而非空列设置filehelpers

C# 如何使用必填而非空列设置filehelpers,c#,filehelpers,C#,Filehelpers,我一直在浏览filehelpers文档,但似乎没有任何东西可以处理列中的空值。我需要能够在所有列上设置“非空”字符串属性 有人能给我指出正确的方向吗?默认情况下,空字符串将在FileHelpers中解析为字符串。空的,但您可以使用自定义转换器覆盖它: public class EmptyStringConverter : ConverterBase { public override object StringToField(string sourceString) {

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


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

默认情况下,空字符串将在FileHelpers中解析为
字符串。空的
,但您可以使用自定义转换器覆盖它:

public class EmptyStringConverter : ConverterBase
{
    public override object StringToField(string sourceString)
    {
        if (String.IsNullOrWhiteSpace(sourceString))
            return null;
        return sourceString;
    }
}
然后像这样定义记录类属性

[FieldConverter(typeof(EmptyStringConverter))]
public string Field1;

如果与
字段1
对应的字符串为空或为空,则该字符串将转换为null。

您可以在
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");
    }
}
[分隔符记录(“|”)
公共类MyClass
{
公共字符串字段1;
公共字符串字段2;
公共字符串字段3;
}
班级计划
{
静态void Main(字符串[]参数)
{
var engine=new FileHelperEngine();
engine.AfterReadRecord+=新的FileHelpers.Events.AfterReadHandler(engine\u AfterReadRecord);
engine.ErrorMode=ErrorMode.Save并继续;
//导入带有无效电子邮件的记录
MyClass[]validRecords=engine.ReadString(“Hello | | World”);
ErrorInfo[]errors=engine.ErrorManager.errors;
Assert.AreEqual(1,engine.TotalRecords);//处理了1条记录
Assert.AreEqual(0,validRecords.Length);//0条记录有效
Assert.AreEqual(1,engine.ErrorManager.ErrorCount);//发现1个错误
Assert.That(错误[0]。ExceptionInfo.Message==“Field2无效”);
}
静态无效引擎\u AfterReadRecord(EngineBase引擎,FileHelpers.Events.AfterReadEventArgs e)
{
if(String.IsNullOrWhiteSpace(e.Record.Field1))
抛出新异常(“Field1无效”);
if(String.IsNullOrWhiteSpace(e.Record.Field2))
抛出新异常(“Field2无效”);
if(String.IsNullOrWhiteSpace(e.Record.Field3))
抛出新异常(“字段3无效”);
}
}

使用转换器将不起作用,因为
文件助手。FieldBase
在调用转换器之前检查零长度字段并返回Null

使用
公共静态文件HelperEngine 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));
        }
    }
}

对于我们的一个项目,我需要同样的东西,该项目大量使用FileHelper,并提供了新的,可以这样使用:

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

在上面的示例中,如果源文件中的Field1或Field3为空,则会抛出一个。

您的问题相当模糊:如何定义FileHelpers记录类?您是要导入还是导出?您的所有列都是字符串还是其中的一些是整数、日期等?是的,我正在定义record类。我正在尝试导入到字符串中,默认情况下,字符串可以为空。我认为这就是问题所在。FileHelpers没有对字符串的空值进行验证。我需要这样做才能在行上导致错误,这样我就可以抛出一个异常了?我明白了-您想对字段执行验证,如果记录为null则拒绝它-这在您的问题中不清楚。我将添加另一个答案。谢谢,这帮助我解决了在DB中将空字符串保存为“”的问题,它们现在保存为NULL。ppl的未来注意事项看看这个答案。我实际上已经决定存储第一次传递的有效行,然后在填充的类记录本身上进行我自己的验证,尽管我可能会按照您建议的路线进行。谢谢你的帮助。你知道我可以在哪里向这个库提交bug吗?我发现了一个bug,我想发送一个补丁(可能有github/bitbucket存储的repo)。另一个解决方案是在
AfterReadRecord
事件中设置
e.SkipThisRecord=true
,它只会忽略该行,而不会引发异常。