3

ファイルヘルパーのドキュメントを調べてきましたが、列の空の値を処理するものはないようです。すべての列に「空でない」文字列属性を設定できるようにする必要があります。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

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");
    }
}
于 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 に答える