如何使用 CsvHelper 将 IList<T> 写入 csv 文件?
How to write IList<T> to csv file using CsvHelper?
我刚开始使用 Josh Close 的 CsvHelper 组件。但是我还没有完全理解映射的概念。我有一个 class 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; }
}
现在我想将这些 classes 写入 csv 文件。样本输出可能是这样的:
Order.Id;Order.Address.Name;Order.Address.City
1;"Bob Miller";"London"
我有两个映射 classes 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);
}
}
但这会产生以下输出:
Id,Addresses
1,CsvHelperClassMappingTest.Address
那么,我在这里缺少什么?
据我所知,CsvClassMap
s 仅用于阅读,不用于写作。要获得您正在寻找的输出,您只需将复杂的 Order
对象映射到与 CSV 中所需布局相匹配的平面对象。像这样定义你的 class:
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);
如果你觉得懒惰,你甚至可以使用匿名类型而不是预先定义一个。
我刚开始使用 Josh Close 的 CsvHelper 组件。但是我还没有完全理解映射的概念。我有一个 class 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; }
}
现在我想将这些 classes 写入 csv 文件。样本输出可能是这样的:
Order.Id;Order.Address.Name;Order.Address.City
1;"Bob Miller";"London"
我有两个映射 classes 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);
}
}
但这会产生以下输出:
Id,Addresses
1,CsvHelperClassMappingTest.Address
那么,我在这里缺少什么?
据我所知,CsvClassMap
s 仅用于阅读,不用于写作。要获得您正在寻找的输出,您只需将复杂的 Order
对象映射到与 CSV 中所需布局相匹配的平面对象。像这样定义你的 class:
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);
如果你觉得懒惰,你甚至可以使用匿名类型而不是预先定义一个。