2017-05-16 25 views
0

FileHelpersの引用符で囲まれたフィールドを読むには一重引用符が含まれていますか?以下は引用符で囲まれたフィールドFileHelpersには一重引用符が含まれていますか?

私のCSVレコードが

"1","7" Screen","Mobile" 

モデルである:上記のレコードの取得中にエラーが発生

[DelimitedRecord(",")] 

public class LineModel 
{ 

[FieldQuoted('"', QuoteMode.OptionalForBoth)] 

public string Id; 

[FieldQuoted('"', QuoteMode.OptionalForBoth)] 

public string Details; 

[FieldQuoted('"', QuoteMode.OptionalForBoth)] 

public string Device; 

} 

: - フィールドの詳細が引用されているが、引用された文字を、「ちょうど区切りの前にありません(このエラーを回避するには、[FieldTrim]を使用してください)

答えて

0

QuoteModeあいまいな引用符あなたの入力ファイルに含まれています。代わりに、[FieldQuoted]属性を削除し、カスタムコンバータで引用符を処理できます。

[DelimitedRecord(",")] 
public class LineModel 
{ 
    [FieldConverter(typeof(MyQuotedFieldConverter))] 
    public string Id; 

    [FieldConverter(typeof(MyQuotedFieldConverter))] 
    public string Details; 

    [FieldConverter(typeof(MyQuotedFieldConverter))] 
    public string Device; 
} 

public class MyQuotedFieldConverter : ConverterBase 
{ 
    public override object StringToField(string from) 
    { 
     // If the field starts and ends with a double quote 
     if (from.StartsWith("\"") && from.EndsWith("\"")) 
     { 
      // Remove the first and last character 
      return from.Substring(1, from.Length - 1); 
     } 
     return from; 
    } 
} 

もちろん、フィールド内に「、」があると問題が発生します。

"1","7, Screen","Mobile" 

は、その場合、あなたはINotifyReadインターフェイスを実装することによって、入力をクリーンアップするために、レコードラインを事前に解析する必要があります。以下のような何か:

[DelimitedRecord(",")] 
public class LineModel : INotifyRead 
{ 
    //... fields as before 

    public void BeforeRead(BeforeReadEventArgs e) 
    { 
     if (e.RecordLine.Count(x => x == ',') > 3) 
     { 
      e.RecordLine = DetectAndReplaceEmbeddedDelimiters(e.RecordLine); 
     } 
    } 

    public void AfterRead(AfterReadEventArgs e) 
    {     
    } 
} 

逆に考慮すべきもう一つのアプローチ:すべてのフィールドに引用符を追加したり削除/組み込み引用符を置き換えるために、カスタム・コンバータを使用します。次に、QuoteMode.AlwaysQuotedを使用します。

関連する問題