Cinchoo ETL——CSV Lite阅读器

目录

1、简介

2. 要求

3.“Hello World!” 示例

3.1 快速加载——数据优先方法

3.2. 代码优先方法

3.2.1 使用用户定义的映射器

3.2.2 使用默认的内置Mapper

3.2.3 使用位置内置Mapper

3.2.4 使用命名内置Mapper

3.2. 其他阅读器方法

3.3. CSV到数据表

3.4. CSV到数据读取器


1、简介

ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中获取数据。本文讨论如何使用ChoETL框架提供的CSVReader组件。这是一个从文件/源中提取CSV数据的简单实用程序类。

特征:

  • 超快的CSV阅读器,快速解析CSV文件。(100万行,20列大约需要7秒) 
  • 基于流的解析器允许终极性能、低资源使用和几乎无限的多功能性,可扩展到任何大小的数据文件,甚至数十或数百GB
  • 遵循CSV标准文件规则(多行、引用列等)。 
  • 除了逗号之外,还可以使用大多数分隔字符,包括制表符分隔的字段。
  • 公开 IEnumarable 对象列表——通常与LINQ查询一起用于投影、聚合和过滤等。
  • 支持延迟阅读。
  • 能够从CSV文件中获取类型化的对象列表。

2. 要求

该框架库是使用.NET 4.5 Framework/.NET core 2.xC#编写的。

3.“Hello World” 示例

  • 打开VS.NET 2013或更高版本
  • 创建示例VS.NET (.NET Framework 4.5)控制台应用程序项目
  •  使用基于.NET环境的Nuget命令, 通过 Package Manager Console安装 ChoETL 
    • 安装包ChoETL
    • 安装包ChoETL.NETStandard
  • 使用 ChoETL命名空间
  • 使用ChoCSVLiteReader类解析CSV文件

让我们从一个读取包含2列的CSV文件的简单示例开始

清单 3.1 示例CSV数据文件(Emp.csv)

Id,Name
1,Tom
2,Carl
3,Mark

有多种方法可以让您以最少的设置开始解析CSV文件

3.1 快速加载——数据优先方法

这是一种零配置、 快速加载CSV文件的方法。不需要POCO对象。下面的示例代码显示了如何加载文件

清单 3.1.1 使用迭代器加载CSV文件(最快)

using (var r = new ChoCSVLiteReader())
{
    //Open the reader, skip the header
    foreach (var cols in r.ReadFile("emp.csv").Skip(1))
    {
        Console.WriteLine($"Id: {cols[0]}");
        Console.WriteLine($"Name: {cols[1]}");
    }
}

fiddle示例:  https ://dotnetfiddle.net/kWhr27

清单 3.1.2 使用循环加载CSV文件(最快)

using (var r = new ChoCSVLiteReader())
{
    //Open the reader, skip the header 
    var recNum =  r.ReadFile("emp.csv").Skip(1).GetEnumerator();
    while (recNum.MoveNext())
    {
        var cols = recNum.Current;
        Console.WriteLine($"Id: {cols[0]}");
        Console.WriteLine($"Name: {cols[1]}");
    }
}

fiddle示例:https ://dotnetfiddle.net/bV7nq5

您也可以按名称访问csv字段。下面的示例显示了如何通过名称访问它们

使用ChoDynamicObject (特殊类型的expando对象)

清单 3.1.3 使用列名加载CSV文件(使用ChoDynamicObject

using (var r = new ChoCSVLiteReader())
{
    foreach (dynamic rec in r.ReadFile<ChoDynamicObject>("emp.csv", true))
    {
        Console.WriteLine($"Id: {rec.Id}");
        Console.WriteLine($"Name: {rec.Name}");
    }
}

fiddle示例:https ://dotnetfiddle.net/PTnx2L

使用ExpandoObject 

清单 3.1.4 使用列名加载CSV文件(使用ExpandoObject

using (var r = new ChoCSVLiteReader())
{
    foreach (var rec in r.ReadFile<ExpandoObject>("emp.csv", true))
    {
        Console.WriteLine($"Id: {rec.Id}");
        Console.WriteLine($"Name: {rec.Name}");
    }
}

如果CSV文件没有标题,CSVReader会自动将动态对象中的列命名为 Column1Column2  ...

3.2. 代码优先方法

这是使用POCO类解析和加载CSV文件的另一种 零配置 方式。首先定义一个简单的数据类来匹配底层的CSV文件布局

清单 3.2.1 简单的POCO实体类

public partial class EmployeeRec
{
    public int Id { get; set; }
    public string Name { get; set; } 
}

在上面,该类定义了两个与示例CSV文件模板匹配的属性。

3.2.1 使用用户定义的映射器

下面的示例显示了如何使用自定义用户定义的映射器加载CSV 

清单 3.2.1.1 使用自定义的用户定义映射器加载CSV文件

foreach (var rec in r.ReadFile<EmployeeRec>("emp.csv", true, 
     mapper: (lineno, cols, rec) =>
     {
         rec.Id = cols[0].CastTo<int>();
         rec.Name = cols[1];
     }))
{
    Console.WriteLine($"Id: {rec.Id}");
    Console.WriteLine($"Name: {rec.Name}");
}

在上面的示例中,我们使用映射器函数控制将CSV值加载到对象成员。

fiddle示例:https ://dotnetfiddle.net/NZZ5EK

3.2.2 使用默认的内置Mapper

下面的示例显示了如何使用CSV阅读器附带的默认内置映射加载CSV文件

清单 3.2.2.1 使用内置映射器加载CSV文件(默认映射)

foreach (var rec in r.ReadFile<EmployeeRec>("emp.csv", true))
{
    Console.WriteLine($"Id: {rec.Id}");
    Console.WriteLine($"Name: {rec.Name}");
}

在上面的示例中,我们让解析器使用内置的映射器功能将CSV值加载到对象成员。默认情况下,内置映射器仅按索引将CSV列映射到对象成员(第一列映射到第一个对象成员,第二个映射到第二个对象成员,依此类推)。

fiddle示例:https ://dotnetfiddle.net/IZRKWT

3.2.3 使用位置内置Mapper

如果CSV文件的顺序与定义的POCO模型对象不同,但想通过位置映射加载它们,您可以通过ColumnAttribute装饰对象成员来指定到CSV列的映射顺序

清单 3.2.3.1 带有OrderAttributePOCO实体类

public partial class EmployeeRec
{
    [Column(Order=1)]
    public string Name { get; set; } 
    [Column(Order=0)] 
    public int Id { get; set; }
}

清单 3.2.3.2 使用内置映射器加载CSV文件(位置图)

foreach (var rec in r.ReadFile<EmployeeRec>("emp.csv", true))
{
    Console.WriteLine($"Id: {rec.Id}");
    Console.WriteLine($"Name: {rec.Name}");
}

在上面的示例中,解析器在解析过程中使用order属性将CSV列映射到相应的对象成员。

fiddle示例:https ://dotnetfiddle.net/fwd3j5

3.2.4 使用命名内置Mapper

如果CSV文件带有与定义的POCO模型对象成员不匹配的列标题,您可以通过使用 DisplayNameAttribute/DisplayAttributeCSV列名称指定给对象成员来匹配它们

清单 3.2.4 带有DisplayNameAttributePOCO实体类

public partial class EmployeeRec
{
    [DisplayName("Id")]
    public int Identifier { get; set; }
    [DisplayName("Name")]
    public string GivenName { get; set; } 
}

清单 3.2.5 使用内置映射器加载CSV文件(名称映射)

foreach (var rec in r.ReadFile<EmployeeRec>("emp.csv", true))
{
    Console.WriteLine($"Id: {rec.Id}");
    Console.WriteLine($"Name: {rec.Name}");
}

在上面的示例中,解析器在解析过程中使用显示属性将CSV列映射到相应的对象成员。

fiddle示例:https ://dotnetfiddle.net/K65Ywq

3.2. 其他阅读器方法

非泛型重载

  1. ReadText——解析csv文本,返回string[]
  2. ReadFile——解析csv文件,返回string[]
  3. Read——解析csv流,返回string[]
  4. ReadLines——解析csv行,返回string[]

泛型重载

  1. ReadText<T>——解析csv文本,返回T
  2. ReadFile<T>——解析csv文件,返回T
  3. Read<T>——解析csv流,返回T
  4. ReadLines<T>——解析csv行,返回T

3.3. CSV到数据表

Cinchoo ETL库提供了帮助方法来将任何可枚举的对象转换为Datatable。这种转换有助于将CSV数据绑定到网格/其他控件/在内存中处理它们等。

下面的示例显示了如何将CSV转换为数据表

清单 3.3.1 CSV转换为DataTable

using (var r = new ChoCSVLiteReader())
{
    var recs = r.ReadFile<EmployeeRec>("emp.csv", true);
    var dt = recs.AsDataTable();
}

3.4. CSV到数据读取器

Cinchoo ETL库提供了帮助方法来将任何可枚举的对象转换为DataReader。这种转换有助于通过ADO.NET/EF处理(导出)大型CSV文件到任何数据库。

下面的示例显示了如何将CSV转换为datareader

清单 3.4.1 CSV转换为DataReader

using (var r = new ChoCSVLiteReader())
{
    var recs = r.ReadFile<EmployeeRec>("emp.csv", true);
    var dr = recs.AsDataReader();
}

https://www.codeproject.com/Articles/5320967/Cinchoo-ETL-CSV-Lite-Reader

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值