ファイルヘルパーのドキュメントを調べてきましたが、列の空の値を処理するものはないようです。すべての列に「空でない」文字列属性を設定できるようにする必要があります。
誰かが私を正しい方向に向けることができますか?
ファイルヘルパーのドキュメントを調べてきましたが、列の空の値を処理するものはないようです。すべての列に「空でない」文字列属性を設定できるようにする必要があります。
誰かが私を正しい方向に向けることができますか?
イベントで必要な検証を実行できます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");
}
}
デフォルトでは、空の文字列はString.Empty
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;
に対応する文字列Field1
が空または空白の場合、null に変換されます。
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));
}
}
}