Используя CsvHelper я могу перевести пустое пространство в обнуляемое значение?
У меня есть некоторые действительно хромые файлы CSV, которые мне нужно проанализировать. Я использую CsvHelper, и он работает потрясающе. За исключением того, что у меня есть несколько строк, которые имеют пробелы, где обычно у меня есть двойной.
Файл:
Текст, SomeDouble, MoreText
«Хорошо», 1,23, «Хорошо»
«Плохо», «Плохо»
если я попытаюсь отобразить это в
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; }
}
тогда я получаю ошибку как это:
CsvHelper.CsvReaderException: произошла ошибка при попытке прочитать запись типа
Строка: '2' (на основе 1)
Индекс поля: '1' (на основе 0)
Имя поля: SomeDouble
Значение поля: ''
System.Exception: недопустимое значение для Double. ---> System.FormatException: входная строка была в неправильном формате.
в System.Number.ParseDouble (строковое значение, параметры NumberStyles, NumberFormatInfo numfmt) в System.ComponentModel.DoubleConverter.FromString (строковое значение, NumberFormatInfo formatInfo) в System.ComponentModel.BaseNumberConverter.ConvertFrom (value) context, culturetexture (ITypeDescript) - Конец внутренней трассировки стека исключений --- в System.ComponentModel.BaseNumberConverter.ConvertFrom (контекст ITypeDescriptorContext, CultureInfo culture, значение объекта) в System.ComponentModel.NullableConverter.ConvertFrom (контекст ITypeDescriptorContext, CultureInfo culture, значение объекта at ld) Закрытие, ICsvReader) в CsvHelper.CsvReader.d__0`1.MoveNext ()
На мой взгляд, я могу создать собственный синтаксический анализатор или сопоставить мое значение со строковым свойством и выполнить там разбор.
Есть ли другие варианты?
Было бы неплохо, если бы я мог настроить, что я хочу рассматривать пустое пространство как ноль.
В соответствии с запросом приведен пример кода, который воспроизводит проблему
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'...
}
}
Благодарю.