2012-04-18 6 views
2

私は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; 

のようなあなたのレコードクラスのプロパティを定義します。空の文字列がFileHelpersにString.Emptyとして解析されますが、カスタムコンバータでこれを無効にすることができ、デフォルトで

+0

あなたの質問はむしろあいまいです。どのようにFileHelpersレコードクラスを定義していますか?インポートまたはエクスポートしようとしていますか?すべての列が文字列か、整数、日付などの一部ですか? – shamp00

+0

はいレコードクラスを定義しています。私は文字列にインポートしようとしていますが、これはデフォルトではヌル可能です。私はそれが問題だと思う。 FileHelpersは文字列の空の値に対する検証を持っていません。 – jaffa

答えて

3

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"); 
    } 
} 
+0

私はあなたが提案したルートに行くかもしれませんが、最初のパスから有効な行を格納して、それから、自分自身の検証を実装しました。助けてくれてありがとう。私はこのライブラリにバグをどこに提出できるのか知っていますか?私はバグを見つけました。パッチを送ってみたいと思います(github/bitbucketにレポが保存されているかもしれないと思っていました)。 – jaffa

+0

おそらくここには最高の場所があります:http://www.filehelpers.com/forums/ – shamp00

+0

もう一つの解決策は、例外をスローするのではなく行を無視する 'AfterReadRecord'イベントで' e.SkipThisRecord = true'を設定することです。 – shamp00

3

Field1に対応する文字列が空またはブランクの場合、nullに変換されます。

+1

行でエラーが発生するために必要なので、例外をスローできますか? – jaffa

+0

私はフィールド上で検証を実行し、レコードがnullの場合はそのレコードを拒否したいと思います。別の答えを追加します。 – shamp00

+0

ありがとう、これは空の文字列がDBに ""として保存されているのを助けました、彼らは今NULLとして保存しています。この答えを見ているpplの将来の注意。 –

1
ゼロレングスフィールドの 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)); 
     } 
    } 
} 
+0

EmptyStringConverterのアプローチが私のために働いていました。 –

2

私は重くFileHelpersを利用して、当社の事業の一つのために同じことを必要とし、そのように使用することができ、新たなFieldNotEmptyAttributeを提供するために貢献した:上記の例で

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

、フィールド1場合ソースファイルでField3が空の場合は、ConvertExceptionがスローされます。

関連する問題