ChoETL框架:.NET环境中的CSV文件处理

ChoETL是一个开源的ETL(提取、转换和加载)框架,专为.NET环境设计。它是一个基于代码的库,用于从多个数据源提取数据、进行转换,并加载到自己的数据仓库中。使用ChoETL框架,可以在短时间内将数据加载到数据仓库中。本文将讨论ChoETL框架提供的CSVReader组件,这是一个简单的实用工具类,用于从文件或源中提取CSV数据。

特性

ChoETL框架的CSVReader组件具有以下特性:

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

需求

ChoETL框架库是用C#编写的,使用.NET4.5 Framework / .NET Core 2.x。

“Hello World!” 示例

打开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(); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485