2017-05-16 2 views
0

Wie zu lesen FileHelpers zitiert Felder enthält einzelnes Zitat?FileHelpers zitiert Felder enthält einzelnes Zitat?

Unten ist meine csv Aufzeichnung

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

Modell:

[DelimitedRecord(",")] 

public class LineModel 
{ 

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

public string Id; 

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

public string Details; 

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

public string Device; 

} 

für oben Rekord Erste Fehler: - Das Feld Details der zitiert wird, aber die zitierte char: "nicht nur vor dem Separator (Sie können [FieldTrim] verwenden, um diesen Fehler zu vermeiden)

Antwort

0

QuoteMode funktioniert nicht sehr gut, wenn Sie mehrdeutig quot haben es in Ihrer Eingabedatei. Stattdessen können Sie die Attribute [FieldQuoted] entfernen und die Anführungszeichen in einem benutzerdefinierten Konverter behandeln.

[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; 
    } 
} 

Natürlich haben Sie dann Probleme, wenn Sie "," in Ihren Feldern haben.

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

In diesem Fall müssen Sie die Rekordlinie durch die Implementierung der Schnittstelle INotifyRead die Eingabe aufzuräumen vorge analysieren. Etwas wie:

[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) 
    {     
    } 
} 

Ein weiterer Ansatz umgekehrt zu beachten: Verwenden Sie die benutzerdefinierte Konverter Anführungszeichen zu jedem Feld hinzuzufügen und zu entfernen/eingebetteten Anführungszeichen zu ersetzen. Dann verwenden Sie QuoteMode.AlwaysQuoted.

Verwandte Themen