我有一些非常蹩脚的 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(String value, NumberStyles options, NumberFormatInfo numfmt) 在 System.ComponentModel.DoubleConverter.FromString(String value, NumberFormatInfo formatInfo) 在 System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo 文化, Object value) - -- 内部异常堆栈跟踪结束 --- 在 System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfoculture, Object value) 在 System.ComponentModel.NullableConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfoculture, Object value) 在 lambda_method( CsvHelper.CsvReader.d__0`1.MoveNext() 处的闭包、ICsvReader
正如我所看到的,我的选择是创建一个自定义解析器,或者将我的值映射到一个字符串属性并在那里进行解析。
还有其他选择吗?
如果我可以配置我想将空白视为空,那就太好了。
根据要求,这是一个重现问题的代码示例
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'...
}
}
谢谢。