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
.