Cinchoo ETL——比较两个CSV文件的添加、更改或删除记录(主要与详细)

目录

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文件


1、简介

ChoETL是一个用于.NET的开源ETL(提取、转换和加载)框架。它是一个基于代码的库,用于在.NET环境中从多个来源提取数据、转换并加载到您自己的数据仓库中。您可以立即在数据仓库中获取数据。

本文讨论了使用Cinchoo ETL框架比较两个CSV文件的AddDeletedChanged记录。使用起来非常简单,几行代码就可以进行比较。您可以轻松地比较大文件,因为该操作是基于流的,速度非常快且内存占用少。

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

清单 3.1.2 详细信息文件(detail.csv)

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 Framework

Install-Package ChoETL

.NET Core

Install-Package ChoETL.NETStandard

现在将ChoETL命名空间添加到程序中。

using ChoETL;

3.2 比较操作

由于输入文件可能很大,我们需要考虑有效合并它们的方法。这是一种适应合并此类CSV文件的方法。

  1. 首先,打开每个CSV文件(主CSV文件和详细CSV文件),将它们放入变量中。
  2. 然后,打开ChoCSVWriter以便写入。
  3. 最后,对输入的CSV文件流调用Compare扩展方法进行比较。在这里,指定key("ID")列以及compare("name")列。用于匹配CSV文件之间记录的键列。比较用于查找匹配记录中是否有任何更改的列。比较操作产生Tuple<Master, Detail, Status>记录。

CompareStatus枚举保持以下状态的位置

  • Unchanged
  • Changed
  • New
  • Deleted

清单 3.2.1 比较主——详细CSV文件

private static void CompareCSVFiles()
{
    //Open master CSV file
    var r1 = ChoCSVReader.LoadText("master.csv").
             WithFirstLineHeader().WithMaxScanRows(1).OfType<ChoDynamicObject>();

    //Open detail CSV file
    var r2 = ChoCSVReader.LoadText("detail.csv").
             WithFirstLineHeader().WithMaxScanRows(1).OfType<ChoDynamicObject>();

    //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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值