【问题标题】:How to write IList<T> to csv file using CsvHelper?如何使用 CsvHelper 将 IList<T> 写入 csv 文件?
【发布时间】:2017-02-27 17:16:01
【问题描述】:

我刚开始使用 Josh Close 的 CsvHelper 组件。但是我还没有完全理解映射的概念。我有一个类Order,看起来像这样:

public class Order
{
  public int Id { get; set; }

  public IList<Address> Addresses { get; set; }
}

Address 看起来像这样:

public class Address
{
  public string Name { get; set; }

  public string City { get; set; }
}

现在我想将这些类写入 csv 文件。示例输出可能是这样的:

Order.Id;Order.Address.Name;Order.Address.City
1;"Bob Miller";"London"

我有两个映射类OrderMapAddressMap

public sealed class OrderMap : CsvClassMap<Order>
{
  public OrderMap ()
  {
    Map (m => m.Id);
    Map (m => m.Addresses).Index (0);
  }
}

public sealed class AddressMap : CsvClassMap<Address>
{
  public AddressMap ()
  {
    Map (m => m.Name);
    Map (m => m.City);
  }
}

但这会产生以下输出:

Id,Addresses
1,CsvHelperClassMappingTest.Address

那么,我在这里错过了什么?

【问题讨论】:

    标签: csvhelper


    【解决方案1】:

    据我所知,CsvClassMaps 仅用于阅读,不用于写作。要获得您正在寻找的输出,您只需将复杂的 Order 对象映射到与您在 CSV 中想要的布局匹配的平面对象。像这样定义你的类:

    class FlatOrder
    {
        public FlatOrder(Order order)
        {
            Id = order.Id;
            var firstAddress = order.Address[0];
            AddressName = firstAddress.Name;
            AddressCity = firstAddress.City;
        }
    
        public int Id { get; set; }
    
        public string AddressName { get; set; }
    
        public string AddressCity { get; set; }
    }
    

    然后映射并编写您的对象:

    var flatOrders = orders.Select(o => new FlatOrder(o));
    csv.WriteRecords(flatOrders);
    

    如果您觉得懒惰,您甚至可以使用匿名类型,而不是预先定义一个。

    【讨论】:

    • 建议的解决方案有效。谁能确认CsvClassMap 和自动映射仅用于阅读目的?
    • 我对@9​​87654327@ 仅用于阅读显然是错误的。正如您在 [this test file] (github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper.Tests/…) 中看到的,它们用于写作,但我不确定它们的使用规则。我仍然认为投影到平面物体更简单、更直接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多