我有一个CSV文件,其结构类似于以下内容:
Header1,Header2,Header3
1,2,3
5,,6
4,4,4
使用Josh Close的CsvHelper并按照GetRecords<T>
调用时:
List<TestData> data = csvReader.GetRecords<TestData>();
数据列表不包含第二行。我已经修改了设置并试图实现一个双转换器,它接受一个空字符串并在空时返回'0'但是该行仍然被丢弃。 我正在努力避免为每个字段进行手动获取。但是,我仍然会对逐行解决方案感到满意,即csvReader.GetRecord<TestData>()
嵌套在循环中。
我有以下测试代码:
public class When_importing_csv_with_missing_filed
{
[Test]
public void Dont_discard_the_row_with_missing_field()
{
using (TextReader textReader = new StreamReader("Test.csv"))
{
Assert.IsTrue(File.Exists("Test.csv"));
var reader = new CsvReader(textReader);
reader.Configuration.RegisterClassMap<TestMap>();
reader.Configuration.IgnoreReadingExceptions = true;
reader.Configuration.SkipEmptyRecords = false;
List<TestData> testData = reader.GetRecords<TestData>().ToList();
}
}
}
public class TestMap : CsvClassMap<TestData>
{
public override void CreateMap()
{
Map(m => m.Header1).Name("Header1").TypeConverter<DoubleConverter>();
Map(m => m.Header2).Name("Header2").TypeConverter<NullValueTypeConverter>();
Map(m => m.Header3).Name("Header3").TypeConverter<DoubleConverter>();
}
}
public class NullValueTypeConverter : DoubleConverter
{
public override object ConvertFromString(TypeConverterOptions options, string text)
{
return String.IsNullOrEmpty(text) ? 0 : base.ConvertFromString(options, text);
}
public override bool CanConvertFrom(Type type)
{
return type == typeof(string);
}
}
public class TestData
{
public double? Header1 { get; set; }
public double? Header2 { get; set; }
public double? Header3 { get; set; }
}
给你......
答案 0 :(得分:0)
这似乎对我来说完全没问题。
代码:
void Main()
{
using( var stream = new MemoryStream() )
using( var writer = new StreamWriter( stream ) )
using( var reader = new StreamReader( stream ) )
using( var csv = new CsvReader( reader ) )
{
writer.WriteLine( "Header1,Header2,Header3" );
writer.WriteLine( "1,2,3" );
writer.WriteLine( "5,,6" );
writer.WriteLine( "4,4,4" );
writer.Flush();
stream.Position = 0;
csv.Configuration.RegisterClassMap<TestMap>();
csv.Configuration.IgnoreReadingExceptions = true;
csv.Configuration.SkipEmptyRecords = false;
var records = csv.GetRecords<TestData>().ToList();
records.Dump();
}
}
public class TestData
{
public double? Header1 { get; set; }
public double? Header2 { get; set; }
public double? Header3 { get; set; }
}
public class TestMap : CsvClassMap<TestData>
{
public override void CreateMap()
{
Map(m => m.Header1).Name("Header1");
Map(m => m.Header2).Name("Header2");
Map(m => m.Header3).Name("Header3");
}
}
结果:
Header1 Header2 Header3
1 2 3
5 null 6
4 4 4