ChoETL是一个开源的ETL(提取、转换和加载)框架,专为.NET环境设计。它是一个基于代码的库,用于从多个数据源提取数据、进行转换,并加载到自己的数据仓库中。使用ChoETL框架,可以在短时间内将数据加载到数据仓库中。本文将讨论ChoETL框架提供的CSVReader组件,这是一个简单的实用工具类,用于从文件或源中提取CSV数据。
ChoETL框架的CSVReader组件具有以下特性:
ChoETL框架库是用C#编写的,使用.NET4.5 Framework / .NET Core 2.x。
打开VS.NET2013或更高版本,创建一个.NET Framework 4.5的控制台应用程序项目,并通过Nuget命令安装ChoETL。
Install-Package ChoETL
Install-Package ChoETL.NETStandard
使用ChoETL命名空间,并使用ChoCSVLiteReader类来解析CSV文件。
Id,Name
1,Tom
2,Carl
3,Mark
这是一种零配置、快速加载CSV文件的方法,不需要POCO对象。以下示例代码展示了如何加载文件。
using(var r = new ChoCSVLiteReader())
{
// 打开读取器,跳过标题
foreach(var cols in r.ReadFile("emp.csv").Skip(1))
{
Console.WriteLine($"Id: {cols[0]}");
Console.WriteLine($"Name: {cols[1]}");
}
}
还可以通过名称访问CSV字段。以下示例展示了如何使用ChoDynamicObject(一种特殊的expando对象)访问它们。
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}");
}
}
这是另一种零配置方式,使用POCO类解析和加载CSV文件。首先,定义一个简单的数据类以匹配CSV文件的布局。
public partial class EmployeeRec
{
public int Id { get; set; }
public string Name { get; set; }
}
在上面的代码中,类定义了两个属性,与示例CSV文件模板匹配。
以下示例展示了如何使用自定义用户定义的映射器加载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读取器自带的默认内置映射器加载CSV文件。
foreach(var rec in r.ReadFile<EmployeeRec>("emp.csv", true))
{
Console.WriteLine($"Id: {rec.Id}");
Console.WriteLine($"Name: {rec.Name}");
}
ChoETL框架提供了多种读取器方法,包括非泛型重载和泛型重载,用于解析CSV文本、文件、流和行,并返回相应的数据类型。
ChoETL库提供了一个辅助方法,可以将任何可枚举的对象转换为DataTable。这种转换对于将CSV数据绑定到网格/其他控件/内存中处理等非常有用。
using(var r = new ChoCSVLiteReader())
{
var recs = r.ReadFile<EmployeeRec>("emp.csv", true);
var dt = recs.AsDataTable();
}
ChoETL库还提供了一个辅助方法,可以将任何可枚举的对象转换为DataReader。这种转换有助于通过ADO.NET/EF将大型CSV文件处理(导出)到任何数据库。
using(var r = new ChoCSVLiteReader())
{
var recs = r.ReadFile<EmployeeRec>("emp.csv", true);
var dr = recs.AsDataReader();
}