概述
目录
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.x用C#编写的。
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会自动将动态对象中的列命名为 Column1、Column2 ...。
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 带有OrderAttribute的POCO实体类
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/DisplayAttribute将CSV列名称指定给对象成员来匹配它们
清单 3.2.4 带有DisplayNameAttribute的POCO实体类
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. 其他阅读器方法
非泛型重载
- ReadText——解析csv文本,返回string[]。
- ReadFile——解析csv文件,返回string[]。
- Read——解析csv流,返回string[]。
- ReadLines——解析csv行,返回string[]。
泛型重载
- ReadText<T>——解析csv文本,返回T。
- ReadFile<T>——解析csv文件,返回T
- Read<T>——解析csv流,返回T
- 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!” 示例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复