目录
1、简介
2. 要求
3. 如何使用
3.1 样本数据
清单 3.1.1 主CSV文件(master.csv)
清单 3.1.2 详细信息文件(detail.csv)
清单 3.1.3 CSV输出(output.csv)
.NET Framework
.NET Core
3.2 比较操作
清单 3.2.1 比较主——详细CSV文件
- 下载 Cinchoo ETL 源码
- 下载 Cinchoo ETL 二进制文件 (.NET Core)
- 下载 Cinchoo ETL 二进制文件 (.NET Framework)
- 工作示例 1(.NET Fiddle)
ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中获取数据。
本文讨论了使用Cinchoo ETL框架比较两个CSV文件的Add、Deleted和Changed记录。使用起来非常简单,几行代码就可以进行比较。您可以轻松地比较大文件,因为该操作是基于流的,速度非常快且内存占用少。
2. 要求该框架库是使用.NET 4.5/.NET Core 3.x框架用C#编写的。
3. 如何使用 3.1 样本数据让我们从查看以下示例CSV文件开始。假设这些CSV文件很大,带有不同的字段,它们的列数可能会有所不同。
清单 3.1.1 主CSV文件(master.csv)ID,name
1,Danny
2,Fred
3,Sam
ID,name
1,Danny
3,Pamela
4,Fernando
比较成功后,应生成预期的CSV文件,如下所示:
在这里,我们从比较操作中捕获每条记录的状态并将它们输出到文件中。
清单 3.1.3 CSV输出(output.csv)ID,name,Status
1,Danny,Unchanged
2,Fred,Deleted
3,Pamela,Changed
4,Fernando,New
首先要做的是安装ChoETL/ChoETL.NETStandard nuget包。为此,请在包管理器控制台中运行以下命令。
.NET FrameworkInstall-Package ChoETL
Install-Package ChoETL.NETStandard
现在将ChoETL命名空间添加到程序中。
using ChoETL;
由于输入文件可能很大,我们需要考虑有效合并它们的方法。这是一种适应合并此类CSV文件的方法。
- 首先,打开每个CSV文件(主CSV文件和详细CSV文件),将它们放入变量中。
- 然后,打开ChoCSVWriter以便写入。
- 最后,对输入的CSV文件流调用Compare扩展方法进行比较。在这里,指定key("ID")列以及compare("name")列。用于匹配CSV文件之间记录的键列。比较用于查找匹配记录中是否有任何更改的列。比较操作产生Tuple记录。
CompareStatus枚举保持以下状态的位置
- Unchanged
- Changed
- New
- Deleted
private static void CompareCSVFiles()
{
//Open master CSV file
var r1 = ChoCSVReader.LoadText("master.csv").
WithFirstLineHeader().WithMaxScanRows(1).OfType();
//Open detail CSV file
var r2 = ChoCSVReader.LoadText("detail.csv").
WithFirstLineHeader().WithMaxScanRows(1).OfType();
//Open final output CSV file
using (var w = new ChoCSVWriter(Console.Out).WithFirstLineHeader())
{
//Compare Master and Detail records
foreach (var t in r1.Compare(r2, "ID", "name" ))
{
dynamic v1 = t.MasterRecord as dynamic;
dynamic v2 = t.DetailRecord as dynamic;
//Check on the status and capture it
if (t.Status == CompareStatus.Unchanged || t.Status == CompareStatus.Deleted)
{
v1.Status = t.Status.ToString();
w.Write(v1);
}
else
{
v2.Status = t.Status.ToString();
w.Write(v2);
}
}
}
}
Fiddle示例:https ://dotnetfiddle.net/uPR5Sq
https://www.codeproject.com/Tips/5319954/Cinchoo-ETL-Compare-Two-CSV-Files-for-Add-Changed