Za pomocą CsvHelper mogę przetłumaczyć białą przestrzeń na wartość dopuszczalną?
Mam naprawdę kiepskie pliki Csv, które muszę przeanalizować. Używam CsvHelper i działa on niesamowicie. Z wyjątkiem, że mam kilka linii, które mają białe znaki, gdzie normalnie mam podwójne.
Plik:
Tekst, SomeDouble, MoreText
„Dobry”, 1,23, „Dobry”
„Zły”, „Zły”
jeśli spróbuję to zmapować
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; }
}
wtedy pojawia się następujący błąd:
CsvHelper.CsvReaderException: Wystąpił błąd podczas próby odczytu rekordu typu
Wiersz: „2” (1-punktowy)
Indeks pola: „1” (w oparciu o 0)
Nazwa pola: „SomeDouble”
Wartość pola: ' '
System.Exception: nie jest poprawną wartością dla Double. ---> System.FormatException: ciąg wejściowy nie miał poprawnego formatu.
at System.Number.ParseDouble (wartość String, opcje NumberStyles, NumberFormatInfo numfmt) w System.ComponentModel.DoubleConverter.FromString (wartość String, NumberFormatInfo formatInfo) w System.ComponentModel.BaseNumberConverter.ConvertFrom (kontekst ITypeDescriptorContext, kultura CultureInfo, wartość Object) - - Koniec śledzenia wewnętrznego stosu wyjątków --- w System.ComponentModel.BaseNumberConverter.ConvertFrom (kontekst ITypeDescriptorContext, CultureInfo culture, wartość obiektu) w System.ComponentModel.NullableConverter.ConvertFrom (kontekst ITypeDescriptorContext, CultureInfo culture, wartość obiektu) w lambda_method ( Zamknięcie, ICsvReader) na CsvHelper.CsvReader.d__0`1.MoveNext ()
Widzę, że moje opcje to utworzenie niestandardowego analizatora składni lub odwzorowanie mojej wartości na właściwość ciągu i wykonanie tam analizy składniowej.
Czy są jakieś inne opcje?
Byłoby miło, gdybym mógł skonfigurować, że chcę traktować spację jako pustą.
Zgodnie z prośbą, oto przykładowy kod, który odtwarza problem
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'...
}
}
Dzięki.