您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

寒冰屋 发布时间:2022-05-04 20:59:20 ,浏览量:0

目录

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)
1、简介

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
清单 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记录。

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();

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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0459s