如何使用CsvHelper将IList <t>写入csv文件?

时间:2017-02-27 17:16:01

标签: csvhelper

我刚开始玩Josh Close的CsvHelper组件。但我还没有完全理解绘图的概念。我所拥有的是一个类<?php //Filter the array $goodValues = array_filter($servers, function($e){ return $e['type'] == "good"; //Use this to be sure //return strtolower($e['type']) == "good"; }); //Print the values foreach ($goodValues as $value): ?> <tr> <td style="width:340px;">&nbsp;<?php echo $value['name']; ?></td> <td style="width:240px;"><?php echo $value['ip']; ?></td> </tr> <?php endforeach; ?> ,如下所示:

Order

public class Order { public int Id { get; set; } public IList<Address> Addresses { get; set; } } 看起来像这样:

Address

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

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

  public string City { get; set; }
}

我有两个映射类Order.Id;Order.Address.Name;Order.Address.City 1;"Bob Miller";"London" OrderMap

AddressMap

但是这会产生以下输出:

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);
  }
}

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

1 个答案:

答案 0 :(得分:0)

据我所知,CsvClassMap仅用于阅读,而不是写作。要获得您正在寻找的输出,您只需将复杂的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);

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