【问题标题】:CsvHealper - How to ignore empty columns in csvCsvHealper - 如何忽略 csv 中的空列
【发布时间】:2019-12-21 09:44:16
【问题描述】:

csvHelper 的新手。我想从 csv 文件中删除空列。 我正在使用 CsvWriter 将 csv 行定义类写入流。

这是我的代码:

var records = getRecords(); // list of row definition items
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
using (var csv = new CsvWriter(writer))
{
    csv.WriteRecords(records);
    writer.Flush();
    return stream;
}

有没有办法让 CsvWriter 忽略空列?可能是配置?

actual csv: 

First Name | Middle Name| Last Name |Gender
FName1     |            | LName1    | Male
FName2     |            | LName2    | Female
FName3     |            | LName3    | 


expected csv:

First Name | Last Name |Gender
FName1     | LName1    | Male
FName2     | LName2    | Female
FName3     | LName3    | 

【问题讨论】:

  • 您是说记录列表中的所有对象都有一个始终为空的中间名属性吗?

标签: c# .net csvhelper


【解决方案1】:

可以使用配置来完成此操作。

public static void Main(string[] args)
{
    var records = new List<Foo>
    {
        new Foo { FirstName = "FName1", LastName = "LName1", Gender = "Male"},
        new Foo { FirstName = "FName2", LastName = "LName2", Gender = "Female"},
        new Foo { FirstName = "FName3", LastName = "LName3"},
    };

    using (var csv = new CsvWriter(Console.Out))
    {
        var map = new FooMap();

        var properties = typeof(Foo).GetProperties();

        foreach (var property in properties)
        {
            if(records.All(foo => property.GetValue(foo) == null))
            {
                map.Map(typeof(Foo), property).Ignore();
            }
        }

        csv.Configuration.RegisterClassMap(map);

        csv.WriteRecords(records);
    }

    Console.ReadKey();
}

public class Foo
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public string Gender { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.FirstName).Name("First Name");
        Map(m => m.MiddleName).Name("Middle Name");
        Map(m => m.LastName).Name("Last Name");
        Map(m => m.Gender);
    }
}

如果您不想创建单独的类映射,只需将FooMap 替换为DefaultClassMap&lt;Foo&gt; 并使用AutoMap

var map = new DefaultClassMap<Foo>();
map.AutoMap();

【讨论】:

    【解决方案2】:

    项目记录到不具有中间名属性的对象列表。像这样的东西(使用 linq)

       var projectedRecords = records.Select(r => new PersonDto
       {
           FirstName = r.FirstName,
           LastName = r.LastName,
           Gender = r.Gender
        }).ToList();
    

    然后将projectedRecords 传递给csvWriter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多