【问题标题】:CsvHelper ignore not workingCsvHelper 忽略不工作
【发布时间】:2014-11-04 15:44:39
【问题描述】:

我正在使用CsvHelper 生成基于List 的csv 文件,但我想避免写入其中一个值。根据documentation,我使用CsvClassMap 来指定我想忽略的字段。但是,该值仍在写入文件中。

这是我的课:

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}

这是我的CsvClassMap

public sealed class PersonClassMap : CsvClassMap<Person>
{
    public PersonClassMap()
    {
        Map(m => m.Id).Index(0).Name("Id");
        Map(m => m.FirstName).Index(1).Name("First Name");
        Map(m => m.LastName).Index(2).Name("Last Name");

        Map(m => m.MiddleName).Ignore();
    }
}

这是我用来生成输出的代码:

var persons = new List<Person>
{
    new Person {Id = 1, FirstName = "Randall", MiddleName = "Michael", LastName = "Perry"},
    new Person {Id = 2, FirstName = "Marigold", MiddleName = "Joanne", LastName = "Mercibar"},
    new Person {Id = 3, FirstName = "Sven", MiddleName = "Ergenfein", LastName = "Olafsson"}
};

using (var csvWriter = new CsvWriter(textWriter))
{
    csvWriter.WriteRecords(persons);
    textWriter.Flush();
}

我的输出如下:

Id,名字,中间名,姓氏 1、兰德尔、迈克尔、佩里 2、万寿菊、乔安妮、默西巴尔 3、斯文、厄尔根芬、奥拉夫森

我怎样才能让它停止写MiddleName

【问题讨论】:

    标签: c# .net csvhelper


    【解决方案1】:

    类映射在运行时必须为registered,以便CsvHelper 知道使用它:

    using (var csvWriter = new CsvWriter(textWriter))
    {
        csvWriter.Configuration.RegisterClassMap<PersonClassMap>();
        csvWriter.WriteRecords(persons);
        textWriter.Flush();
    }
    

    另外请注意,在当前版本中,您在类映射中 don't need to explicitly ignore fields(尽管将来会更改):

    忽略

    目前未使用。映射只会映射您指定的属性。将来会有一个在类映射中自动映射的选项,并且任何明确声明的映射都将覆盖自动映射的映射。发生这种情况时,ignore 将用于忽略自动映射的属性。

    考虑到这一点,您还可以像这样简化您的类映射:

    public sealed class PersonClassMap : CsvClassMap<Person>
    {
        public PersonClassMap()
        {
            Map(m => m.Id).Index(0).Name("Id");
            Map(m => m.FirstName).Index(1).Name("First Name");
            Map(m => m.LastName).Index(2).Name("Last Name");
        }
    }
    

    【讨论】:

    • 不知道为什么这被否决了。我在这里学到了一些有用的东西。回复有问题吗?
    • 我猜是因为他发布后立即回答了自己的问题?
    • “不仅可以提出和回答自己的问题,而且明确鼓励这样做”:blog.stackoverflow.com/2011/07/…
    • 部分版本回归,CsvClassMap&lt;T&gt; 更名为ClassMap&lt;T&gt;
    【解决方案2】:

    你可以使用这个标签:[Ignore]

    例如:

    //Ignored value
    [Ignore]
    double value0 = 0;
    
    //Serializable value
    [Name("value 1")]
    double value1 = 0;
    

    【讨论】:

    • 比 Ryan Kohn 的答案简单得多。
    • 必须为 CsvHelper.Configuration.Attributes 添加 using 语句;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多