Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将CsvHelper自定义转换器应用于特定的类映射字段_C#_Asp.net Mvc_Csvhelper - Fatal编程技术网

C# 将CsvHelper自定义转换器应用于特定的类映射字段

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() {

运行CSVHelper 7.0.0并尝试添加可应用于特定类映射字段的自定义字符串转换器(不希望全局应用于字符串类型的所有字段)。下面是关于我当前如何设置类映射、自定义转换器和csv writer调用的代码段

NextReviewDate映射字段上带有自定义转换器的类映射代码段:

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。)