技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

C# CSV解析器TinyCsvParser使用示例:自定义映射

作者:admin    时间:2023-5-22 11:46:12    浏览:

在前面文章中,我介绍了C# CSV解析器TinyCsvParser的一下使用示例,你可参阅:

在本文中,我将继续介绍TinyCsvParser使用示例:自定义映射。

自定义映射

在某些情况下,你可能需要以非 1:1 的方式将 CSV 列映射到输出实体的属性,或者你的输出实体可能包含其他非标量类型,你需要使用 CSV 行中的多个列来填充这些类型。这就是MapUsing发挥作用的地方。MapUsing 接受一个委托,该委托将为 CSV 中的每个非空、非注释行调用。对提供的委托的调用发生在为该行执行了所有MapProperty映射之后,因此你的实体可能在你的委托执行时部分填充了数据。

例子

首先,与任何其他映射一样,你需要建立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()
    }
}

添加MapUsing

现在我们将第一列映射到 OrderId,但是我们如何将第二列和第三列映射到我们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;
        });
    }
}

开始保护

现在我们的MyEntity类将正确填充订单 ID 和一个Person具有正确名字和姓氏集的实例。但是,如果我们遇到缺少名字的行,比如“1234,Acme Inc”,会发生什么情况?这是个坏消息,尤其是如果多行可能缺少第三列……每一行都会引发异常,这对解析性能非常不利。这就是为什么我们要求你的MapUsing委托返回一个布尔值,指示你映射的数据是否产生有效行。

注意:你应该避免做可能在你的委托中引发异常的事情,即使你使用try...catch,引发异常的事实会极大地减慢你的 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;
        });
    }
}

总结

本文介绍了C# CSV解析器TinyCsvParser使用示例:自定义映射,你还可以参阅TinyCsvParser其他使用示例,请看文章:

相关文章

标签: asp.net  CSharp  CSV  TinyCsvParser  
x
  • 站长推荐
/* 左侧显示文章内容目录 */