Usando CsvHelper posso traduzir espaço em branco para um anulável?
Eu tenho alguns arquivos Csv realmente coxos que eu preciso analisar. Eu estou usando CsvHelper e está funcionando incrível. Exceto eu tenho algumas linhas que têm espaço em branco onde normalmente eu tenho um duplo.
Arquivo:
Texto, SomeDouble, MoreText
"Bom", 1,23, "bom"
"Ruim", "Ruim"
se eu tentar mapear isso
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; }
}
então eu recebo um erro como este:
CsvHelper.CsvReaderException: Ocorreu um erro ao tentar ler um registro do tipo
Linha: '2' (baseado em 1)
Índice de campo: '1' (baseado em 0)
Nome do campo: 'SomeDouble'
Valor do campo: ''
System.Exception: não é um valor válido para Double. ---> System.FormatException: string de entrada não estava em um formato correto.
em System.Number.ParseDouble (valor String, NumberStyles options, NumberFormatInfo numfmt) em System.ComponentModel.DoubleConverter.FromString (valor String, NumberFormatInfo formatInfo) em System.ComponentModel.BaseNumberConverter.ConvertFrom (contexto ITypeDescriptorContext, cultura CultureInfo, valor Object) - - Fim do rastreamento de pilha de exceção interna --- em System.ComponentModel.BaseNumberConverter.ConvertFrom (contexto ITypeDescriptorContext, cultura CultureInfo, valor do objeto) em System.ComponentModel.NullableConverter.ConvertFrom (contexto ITypeDescriptorContext, cultura CultureInfo, valor do objeto) em lambda_method ( Encerramento, ICsvReader) no CsvHelper.CsvReader.d__0`1.MoveNext ()
Do meu ponto de vista, minhas opções são criar um analisador personalizado ou mapear meu valor em uma propriedade de string e fazer a análise lá.
Existem outras opções?
Seria bom se eu pudesse configurar que eu quero tratar o espaço em branco como nulo.
Conforme solicitado, aqui está um exemplo de código que reproduz o problema
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'...
}
}
Obrigado.