|
|
|
|
|
在前面文章中,我介紹了C# CSV解析器TinyCsvParser的一下使用示例,你可參閱:
在本文中,我將繼續(xù)介紹TinyCsvParser使用示例:自定義映射。
自定義映射
在某些情況下,你可能需要以非 1:1 的方式將 CSV 列映射到輸出實體的屬性,或者你的輸出實體可能包含其他非標(biāo)量類型,你需要使用 CSV 行中的多個列來填充這些類型。這就是MapUsing
發(fā)揮作用的地方。MapUsing
接受一個委托,該委托將為 CSV 中的每個非空、非注釋行調(diào)用。對提供的委托的調(diào)用發(fā)生在為該行執(zhí)行了所有MapProperty
映射之后,因此你的實體可能在你的委托執(zhí)行時部分填充了數(shù)據(jù)。
例子
首先,與任何其他映射一樣,你需要建立CsvMapping<MyEntity>
。
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class MyEntity
{
public string OrderId { get; set; }
public Person Customer { get; set; }
}
// CSV format: 1234,Doe,John
public class MyMap : CsvMapping<MyEntity>
{
public MyMap()
{
MapProperty(0, x => x.OrderId);
// TODO: Map person using MapUsing()
}
}
現(xiàn)在我們將第一列映射到 OrderId
,但是我們?nèi)绾螌⒌诙泻偷谌杏成涞轿覀?code>Person類的實例呢? 使用MapUsing
!
// CSV format: 1234,Doe,John
public class MyMap : CsvMapping<MyEntity>
{
public MyMap()
{
MapProperty(0, x => x.OrderId);
MapUsing((entity, values) =>
{
// TODO: Invalidate the row if first name is missing.
var customer = new Person();
// WARNING: IndexOutOfRangeException could happen here!!
customer.LastName = values.Tokens[1];
customer.FirstName = values.Tokens[2];
entity.Customer = customer;
return true;
});
}
}
現(xiàn)在我們的MyEntity
類將正確填充訂單 ID
和一個Person
具有正確名字和姓氏集的實例。但是,如果我們遇到缺少名字的行,比如“1234,Acme Inc”,會發(fā)生什么情況?這是個壞消息,尤其是如果多行可能缺少第三列……每一行都會引發(fā)異常,這對解析性能非常不利。這就是為什么我們要求你的MapUsing
委托返回一個布爾值,指示你映射的數(shù)據(jù)是否產(chǎn)生有效行。
注意:你應(yīng)該避免做可能在你的委托中引發(fā)異常的事情,即使你使用try...catch
,引發(fā)異常的事實會極大地減慢你的 CSV 解析速度,即使它被捕獲并丟棄也是如此。
// CSV format: 1234,Doe,John
public class MyMap : CsvMapping<MyEntity>
{
public MyMap()
{
MapProperty(0, x => x.OrderId);
MapUsing((entity, values) =>
{
// Checking that we have enough data and that the data is within range
// should happen before we try to access & map it below.
if(values.Tokens.Length < 3)
{
return false;
}
var customer = new Person();
customer.LastName = values.Tokens[1];
customer.FirstName = values.Tokens[2];
entity.Customer = customer;
return true;
});
}
}
總結(jié)
本文介紹了C# CSV解析器TinyCsvParser使用示例:自定義映射,你還可以參閱TinyCsvParser其他使用示例,請看文章:
相關(guān)文章