Kann ich mit CsvHelper Leerzeichen in Nullable übersetzen?

Ich habe einige wirklich lahme Csv-Dateien, die ich analysieren muss. Ich benutze CsvHelper und es funktioniert super. Es sei denn, ich habe einige Zeilen mit Leerzeichen, in denen ich normalerweise ein Double habe.

Datei:

Text, SomeDouble, MoreText

"Gut", 1,23, "Gut"

"Schlecht", "Schlecht"

wenn ich versuche, dies abzubilden

public class Test
{
  [CsvField(Name = "Text")]
  public string Text { get; set; }

  [CsvField(Name = "SomeDouble")]
  public double? SomeDouble{ get; set; }

  [CsvField(Name = "MoreText")]
  public string MoreText{ get; set; }
}

dann bekomme ich einen fehler wie diesen:

CsvHelper.CsvReaderException: Beim Lesen eines Datensatzes vom Typ ist ein Fehler aufgetreten

Zeile: '2' (1-basiert)

Feldindex: '1' (0-basiert)

Feldname: 'SomeDouble'

Feldwert: ' '

System.Exception: ist kein gültiger Wert für Double. ---> System.FormatException: Die Eingabezeichenfolge hatte kein korrektes Format.
at System.Number.ParseDouble (Zeichenfolgenwert, NumberStyles-Optionen, NumberFormatInfo numfmt) at System.ComponentModel.DoubleConverter.FromString (Zeichenfolgenwert, NumberFormatInfo formatInfo) at System.ComponentModel.BaseNumberConverter.ConvertFrom (ITypeDescripter.Context) - - Ende der inneren Ausnahmestapel-Ablaufverfolgung --- bei System.ComponentModel.BaseNumberConverter.ConvertFrom (ITypeDescriptorContext-Kontext, CultureInfo-Kultur, Objektwert) bei System.ComponentModel.NullableConverter.ConvertFrom (ITypeDescriptorContext-Kontext, CultureInfo-Kultur, Objektwert) bei lda_Methode Closure, ICsvReader) bei CsvHelper.CsvReader.d__0`1.MoveNext ()

Nach meinem Dafürhalten können Sie einen benutzerdefinierten Parser erstellen oder meinen Wert einer Zeichenfolgeeigenschaft zuordnen und die Analyse dort durchführen.

Gibt es noch andere Möglichkeiten?

Es wäre schön, wenn ich konfigurieren könnte, dass ich Leerzeichen als Null behandeln möchte.

Wie angefordert, ist hier ein Codebeispiel, das das Problem reproduziert

 static class Program
    {
        public class Test
        {
            [CsvField(Name = "Text")]
            public string Text { get; set; }

            [CsvField(Name = "SomeDouble")]
            public double? SomeDouble { get; set; }

            [CsvField(Name = "MoreText")]
            public string MoreText { get; set; }
        }

        static void Main(string[] args)
        {
            // create fake in memory file
            var memoryStream = new MemoryStream();
            var streamWriter = new StreamWriter(memoryStream);
            streamWriter.WriteLine("Text,SomeDouble,MoreText");
            streamWriter.WriteLine("Good, 1.23, Good");
            streamWriter.WriteLine("Bad, ,Bad");

            streamWriter.Flush();

            //reset the file to the begining
            memoryStream.Position = 0;

            using (
                var csv =
                    new CsvReader(
                        new StreamReader(memoryStream)))
            {
                // this call will blow up with the exception.
                var records = csv.GetRecords<Test>().ToList();

                //carry on and do stuff with 'records'...
            }
    }

Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage