C# CSVhelper 无法使用自定义映射写入
C# CSVhelper unable to write using a custom mapping
我最近从 CSVHelper 版本 16.0.0 转移到了 27.2.1。在我看来,对于 CSV 编写器来说,映射丢失了,因为它们现在包含在 CSVContext 中,而不是 CSVConfiguration 中。
我想使用自定义映射而不是自动生成的映射来写入 CSV,现在有办法做到这一点吗?
using (StreamWriter _stream = new StreamWriter(_fileLocation))
{
using (CsvWriter _csvWriter = new CsvWriter(_stream, CsvContext.Configuration))
{
_csvWriter.WriteRecords(items);
_csvWriter.Flush();
}
}
我添加了代码作为上下文,你可以看到 CSVWriter
只接受不再包含映射的配置,所以当我检查 CSVWriter
的上下文时,有没有映射。如果我检查 CSVContext
本身,我会看到一个映射,这是我之前制作的自定义映射。
示例:
public class Foo
{
public Guid id {get;set;}
public string name {get;set;}
public DateTime created {get;set;}
}
所以假设我有上面的 class Foo 并且我使用工厂创建了一个自定义 class 映射所以:
private static ClassMap CreateMap()
{
Factory _factory = new Factory();
IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();
_mapper.Map(x => x.id);
_mapper.Map(x => x.name);
return _mapper.Build();
}
然后我这样注册映射:
_context.RegisterClassMap(CreateMap());
我会得出这样的结果:
Id,name,Date
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName,2020-01-01
但我想要的结果是:
Id,name
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName
我想澄清一件事,这是在 16.0.0.0 版本下工作的
RegisterClassMap
从 Configuration
移动到 Context
。您必须在 CsvWriter.Context
.
上注册它
public static void Main(string[] args)
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// Configuration settings
};
using (CsvWriter _csvWriter = new CsvWriter(Console.Out, config))
{
var fooRecords = new List<Foo> { new Foo { id = new Guid("d2e0b6d5-356c-4c34-9437-92942ee9232c"), name = "SomeName", created = new DateTime(2020,1,1)} };
_csvWriter.Context.RegisterClassMap(CreateMap());
_csvWriter.WriteRecords(fooRecords);
_csvWriter.Flush();
Console.Read();
}
}
public class Foo
{
public Guid id {get;set;}
public string name {get;set;}
public DateTime created { get; set; }
}
private static ClassMap CreateMap()
{
Factory _factory = new Factory();
IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();
_mapper.Map(x => x.id);
_mapper.Map(x => x.name);
return _mapper.Build();
}
我最近从 CSVHelper 版本 16.0.0 转移到了 27.2.1。在我看来,对于 CSV 编写器来说,映射丢失了,因为它们现在包含在 CSVContext 中,而不是 CSVConfiguration 中。
我想使用自定义映射而不是自动生成的映射来写入 CSV,现在有办法做到这一点吗?
using (StreamWriter _stream = new StreamWriter(_fileLocation))
{
using (CsvWriter _csvWriter = new CsvWriter(_stream, CsvContext.Configuration))
{
_csvWriter.WriteRecords(items);
_csvWriter.Flush();
}
}
我添加了代码作为上下文,你可以看到 CSVWriter
只接受不再包含映射的配置,所以当我检查 CSVWriter
的上下文时,有没有映射。如果我检查 CSVContext
本身,我会看到一个映射,这是我之前制作的自定义映射。
示例:
public class Foo
{
public Guid id {get;set;}
public string name {get;set;}
public DateTime created {get;set;}
}
所以假设我有上面的 class Foo 并且我使用工厂创建了一个自定义 class 映射所以:
private static ClassMap CreateMap()
{
Factory _factory = new Factory();
IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();
_mapper.Map(x => x.id);
_mapper.Map(x => x.name);
return _mapper.Build();
}
然后我这样注册映射:
_context.RegisterClassMap(CreateMap());
我会得出这样的结果:
Id,name,Date
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName,2020-01-01
但我想要的结果是:
Id,name
d2e0b6d5-356c-4c34-9437-92942ee9232c,SomeName
我想澄清一件事,这是在 16.0.0.0 版本下工作的
RegisterClassMap
从 Configuration
移动到 Context
。您必须在 CsvWriter.Context
.
public static void Main(string[] args)
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
// Configuration settings
};
using (CsvWriter _csvWriter = new CsvWriter(Console.Out, config))
{
var fooRecords = new List<Foo> { new Foo { id = new Guid("d2e0b6d5-356c-4c34-9437-92942ee9232c"), name = "SomeName", created = new DateTime(2020,1,1)} };
_csvWriter.Context.RegisterClassMap(CreateMap());
_csvWriter.WriteRecords(fooRecords);
_csvWriter.Flush();
Console.Read();
}
}
public class Foo
{
public Guid id {get;set;}
public string name {get;set;}
public DateTime created { get; set; }
}
private static ClassMap CreateMap()
{
Factory _factory = new Factory();
IHasMap<Foo> _mapper = _factory.CreateClassMapBuilder<Foo>();
_mapper.Map(x => x.id);
_mapper.Map(x => x.name);
return _mapper.Build();
}