Cinchoo ETL——将不同的CSV文件合并为一个大的CSV文件

目录

1. 简介

2. 要求

3. 如何使用

3.1 样本数据

3.2 合并操作


1. 简介

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

本文讨论了使用Cinchoo ETL框架将不同的CSV文件合并为一个大的CSV文件。使用非常简单,几行代码就可以完成转换。您可以转换大文件,因为转换过程是基于流的,速度非常快且内存占用少。

2. 要求

该框架库是使用.NET 4.5/.NET Core 3.x框架用C#编写的。

3. 如何使用

3.1 样本数据

让我们从查看以下示例CSV文件开始。假设这些CSV文件很大,带有不同的字段,它们的列数可能会有所不同。

清单 3.1.1 CSV文件 1 (sample1.csv)

col1, col2, col3
val1, val2, val3
val11, val21, val31

清单 3.1.2 CSV文件 2 (sample2.csv)

col1, col3
val4, val5
val41, val51

清单 3.1.3 CSV文件3 (sample3.csv)

col1, col4
val6, val7
val61, val71

成功合并后,预期的CSV文件应如下所示

清单 3.1.4 CSV输出(merge.csv)

col1, col2, col3, col4
val1, val2, val3,
val11, val21, val31,
val4, , val5,
val41, , val51,
val6, , , val7
val61, , , val71

首先要做的是安装ChoETL.JSON/ChoETL.JSON.NETStandard nuget包。为此,请在包管理器控制台中运行以下命令。

.NET Framework

Install-Package ChoETL.JSON

.NET Core

Install-Package ChoETL.JSON.NETStandard

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

using ChoETL;

3.2 合并操作

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

  1. 首先打开每个CSV文件,读出第一项。把它们收藏起来。
  2. 接下来通过将集合写入虚拟ChoCSVWriter来评估来自所有输入CSV文件的所有可能列。使用WithMaxScanRows()调用扫描所有CSV文件中的列。捕获配置对象(包含所有扫描的CSV列)以供以后使用。
  3. 最后打开每个CSV文件并使用捕获的配置对象将它们写入ChoCSVWriter 

清单 3.2.1 合并 CSV文件

private static void MergeCSVFiles()
{
    ChoCSVRecordConfiguration config = null;
    List<object> items = new List<object>();

    using (var r1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader())
    {
        using (var r2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader())
        {
            using (var r3 = new ChoCSVReader("sample3.csv").WithFirstLineHeader())
            {
                items.Add(r1.First());
                items.Add(r2.First());
                items.Add(r3.First());
            }
        }
    }

    StringBuilder csv = new StringBuilder();
    using (var w = new ChoCSVWriter(csv)
           .WithFirstLineHeader()
           .WithMaxScanRows(5)
           .ThrowAndStopOnMissingField(false)
          )
    {
        w.Write(items);

        //Capture configuration for later use to merge CSV files
        config = w.Configuration;
    }

    using (var r1 = new ChoCSVReader("sample1.csv").WithFirstLineHeader())
    {
        using (var r2 = new ChoCSVReader("sample2.csv").WithFirstLineHeader())
        {
            using (var r3 = new ChoCSVReader("sample3.csv").WithFirstLineHeader())
            {
                //use the captured configuration object for merging CSV file
                using (var w = new ChoCSVWriter(Console.Out, config)
                       .WithFirstLineHeader()
                      )
                {
                    w.Write(Enumerable.Concat(r1, r2).Concat(r3));
                }
            }
        }
    }
}

Fiddle示例:  https ://dotnetfiddle.net/4L8f0k

https://www.codeproject.com/Tips/5316608/Cinchoo-ETL-Merge-different-CSV-files-into-one-lar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值