gpt4 book ai didi

c# - 如果缺少字段,CsvHelper 将丢弃行

转载 作者:行者123 更新时间:2023-12-04 18:08:16 25 4
gpt4 key购买 nike

我有一个 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; }
}

交给你..

最佳答案

这对我来说似乎完全没问题。

代码:

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

关于c# - 如果缺少字段,CsvHelper 将丢弃行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21125206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com