我刚开始玩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;"> <?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);
}
}
那么,我在这里错过了什么?
答案 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);
如果你感到懒惰,你甚至可以使用匿名类型,而不是预先定义一个。