C# 将CsvHelper自定义转换器应用于特定的类映射字段
运行CSVHelper 7.0.0并尝试添加可应用于特定类映射字段的自定义字符串转换器(不希望全局应用于字符串类型的所有字段)。下面是关于我当前如何设置类映射、自定义转换器和csv writer调用的代码段 NextReviewDate映射字段上带有自定义转换器的类映射代码段:C# 将CsvHelper自定义转换器应用于特定的类映射字段,c#,asp.net-mvc,csvhelper,C#,Asp.net Mvc,Csvhelper,运行CSVHelper 7.0.0并尝试添加可应用于特定类映射字段的自定义字符串转换器(不希望全局应用于字符串类型的所有字段)。下面是关于我当前如何设置类映射、自定义转换器和csv writer调用的代码段 NextReviewDate映射字段上带有自定义转换器的类映射代码段: public sealed class MyCustomClassMap : ClassMap<MyCustomClass> { public MyCustomClassMap() {
public sealed class MyCustomClassMap : ClassMap<MyCustomClass>
{
public MyCustomClassMap()
{
Map(m => m.ContentId).Index(0);
Map(m => m.Name).Index(1);
Map(m => m.ContentOwner).Index(2);
Map(m => m.ContentOwnerName).Index(3);
Map(m => m.CopyrightOwner).Index(4);
Map(m => m.CopyrightOwnerName).Index(5);
Map(m => m.NextReviewDate).Index(6).TypeConverter<DateTimeStringConverter>();
Map(m => m.ContentStatus).Index(7);
Map(m => m.UsageRights).Index(8);
Map(m => m.SchemaName).Index(9);
}
}
我如何注册我的类映射和写入记录的代码片段:
csv.Configuration.RegisterClassMap<MyCustomClassMap>();
csv.WriteRecords(results);
CSV Helper 26.1.0
第一个StringConverter
只提供一种方法来覆盖对象ConvertFromString(..)
对字符串的对话不进行任何处理,因为它被假定为
字符串
在这里,我支持您的类型是DateTime
,并且您可以使用多种Exotique格式。如果只有一种格式,则可以更改该类型的默认格式
一个简单的演示类及其映射:
public class Test
{
public int Id { get; set; }
public DateTime DateTime { get; set; }
public DateTime Date { get; set; }
public DateTime Time { get; set; }
}
public sealed class TestMap : ClassMap<Test>
{
public TestMap()
{
AutoMap(CultureInfo.InvariantCulture);
Map(x => x.Date).TypeConverter(new DateStringConverter("MM - dd - yyyy"));
Map(x => x.Time).TypeConverter(new DateStringConverter("mm # hh # ss"));
}
}
编写CSV:
using (var writer = new StringWriter())
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture, true))
{
csvWriter.Context.RegisterClassMap<TestMap>();
csvWriter.WriteRecords(datas);
csvWriter.Flush();
csvTextOuput = writer.ToString();
}
using (var reader = new StringReader(csvTextOuput))
using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture, true))
{
csvReader.Context.RegisterClassMap<TestMap>();
ObjectFromCSV = csvReader.GetRecords<Test>().ToArray();
}
阅读CSV:
using (var writer = new StringWriter())
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture, true))
{
csvWriter.Context.RegisterClassMap<TestMap>();
csvWriter.WriteRecords(datas);
csvWriter.Flush();
csvTextOuput = writer.ToString();
}
using (var reader = new StringReader(csvTextOuput))
using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture, true))
{
csvReader.Context.RegisterClassMap<TestMap>();
ObjectFromCSV = csvReader.GetRecords<Test>().ToArray();
}
现场演示
CSV助手7 唯一的修改应该是读者/作者的文化缺失。以及从
配置
移动到上下文
- ~new CsvReader(reader,CultureInfo.InvariantCulture,true))~=>new CsvReader(reader))
- ~csvWriter.Context.RegisterClassMap()~=>csvWriter.Configuration.RegisterClassMap()李>
同质日期时间格式accros all属性。 如果建议的解决方案在任何地方都有相同的格式:
TypeConverterFactory
或旧版本上的TypeConverterCache
。CSV Helper 26.1.0
第一个StringConverter
只提供一种方法来覆盖对象ConvertFromString(..)
对字符串的对话不进行任何处理,因为它被假定为
字符串
在这里,我支持您的类型是DateTime
,并且您可以使用多种Exotique格式。如果只有一种格式,则可以更改该类型的默认格式
一个简单的演示类及其映射:
public class Test
{
public int Id { get; set; }
public DateTime DateTime { get; set; }
public DateTime Date { get; set; }
public DateTime Time { get; set; }
}
public sealed class TestMap : ClassMap<Test>
{
public TestMap()
{
AutoMap(CultureInfo.InvariantCulture);
Map(x => x.Date).TypeConverter(new DateStringConverter("MM - dd - yyyy"));
Map(x => x.Time).TypeConverter(new DateStringConverter("mm # hh # ss"));
}
}
编写CSV:
using (var writer = new StringWriter())
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture, true))
{
csvWriter.Context.RegisterClassMap<TestMap>();
csvWriter.WriteRecords(datas);
csvWriter.Flush();
csvTextOuput = writer.ToString();
}
using (var reader = new StringReader(csvTextOuput))
using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture, true))
{
csvReader.Context.RegisterClassMap<TestMap>();
ObjectFromCSV = csvReader.GetRecords<Test>().ToArray();
}
阅读CSV:
using (var writer = new StringWriter())
using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture, true))
{
csvWriter.Context.RegisterClassMap<TestMap>();
csvWriter.WriteRecords(datas);
csvWriter.Flush();
csvTextOuput = writer.ToString();
}
using (var reader = new StringReader(csvTextOuput))
using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture, true))
{
csvReader.Context.RegisterClassMap<TestMap>();
ObjectFromCSV = csvReader.GetRecords<Test>().ToArray();
}
现场演示
CSV助手7 唯一的修改应该是读者/作者的文化缺失。以及从
配置
移动到上下文
- ~new CsvReader(reader,CultureInfo.InvariantCulture,true))~=>new CsvReader(reader))
- ~csvWriter.Context.RegisterClassMap()~=>csvWriter.Configuration.RegisterClassMap()李>
同质日期时间格式accros all属性。 如果建议的解决方案在任何地方都有相同的格式:
注意:
TypeConverterFactory
或旧版本上的TypeConverterCache
。convertFrom字符串用于读取,ConvertToString应该用于编写。如果您对converter有问题,也可以忽略一个属性并添加一个getter属性,该属性将以正确的格式返回。@自切换到ConvertToString重写解决了问题,谢谢!convertFrom字符串用于读取,ConvertToString用于写入。如果您对converter有问题,您也可以忽略一个属性,并添加一个getter属性,该属性将以正确的格式返回。@自切换到ConvertToString重写解决了此问题,谢谢!通过将覆盖更新为ConvertToString解决了我的问题(请参阅主要帖子评论和帖子编辑更新,我将此标记为最相关的答案,因为它非常深入,并且与最新版本的CSVHelper更相关。感谢@self提供的所有优秀反馈,而我的问题通过将覆盖更新为ConvertToString得到了解决。)(请参阅主要帖子评论和帖子编辑更新,我将此标记为最相关的答案,因为它非常深入,与CSVHelper的最新版本更相关。感谢所有优秀的反馈@Self。)