我是靠谱客的博主 俊秀煎蛋,最近开发中收集的这篇文章主要介绍Cinchoo ETL——CSV Lite阅读器1、简介2. 要求3.“Hello World!” 示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

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到数据读取器


  • 下载 Cinchoo ETL 源码
  • 下载 Cinchoo ETL 二进制文件 (.NET Core)
  • 下载 Cinchoo ETL 二进制文件 (.NET Framework)

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

最后

以上就是俊秀煎蛋为你收集整理的Cinchoo ETL——CSV Lite阅读器1、简介2. 要求3.“Hello World!” 示例的全部内容,希望文章能够帮你解决Cinchoo ETL——CSV Lite阅读器1、简介2. 要求3.“Hello World!” 示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部