• ETL.NET 一款处理大数据的开源项目
  • 发布于 2个月前
  • 288 热度
    0 评论
ETL.NET 是一个 .NET 的开源框架,可以毫不费力地实现快速的、低内存的和易于维护的处理数据。即使是百万数据也能轻松应对。ETL.NET 完全用 .NET 编写,可用于多平台使用,并可直接集成到任何应用程序中。ETL.NET 的工作原理与 SSIS 类似,ETL 过程像 Linq 查询一样。通过 Nuget 简单安装后,即可使用。
项目地址https://paillave.github.io/Etl.Net/
数据处理
ETL.NET 支持从多种数据类型和数据源中读取可写入数据,可以满足各种使用场景。包括 SQL server,Entity Framework, CSV,Excel, XML, 文件系统, FTP, SFTP, FTPS,zip 压缩包等等。

如何使用
下面是一个使用 ETL.NET 处理数据的场景。
1. 首先从文件夹中读取所有的 zip 文件。
2. 解压 zip, 并读取其中的 CSV。
3. 解析 CSV 内容, 添加的 Person 的集合中。
4. 去除重复项,并写入到 Sql Server 数据库中。
using System;
using System.Threading.Tasks;
using Paillave.Etl.FileSystem;
using Paillave.Etl.Zip;
using Paillave.Etl.TextFile;
using Paillave.Etl.SqlServer;
using System.Data.SqlClient;
using Paillave.Etl.Core;

namespace SimpleTutorial
{
    class Program
    {
        static async Task Main(string[] args)
        {
           // 堆代码 duidaima.com
            var processRunner = StreamProcessRunner.Create<string>(DefineProcess);
            using (var cnx = new SqlConnection(args[1]))
            {
                cnx.Open();
                var executionOptions = new ExecutionOptions<string>
                {
                    Resolver = new SimpleDependencyResolver().Register(cnx)
                };
                var res = await processRunner.ExecuteAsync(args[0], executionOptions);
                Console.Write(res.Failed ? "Failed" : "Succeeded");
            }
        }
        private static void DefineProcess(ISingleStream<string> contextStream)
        {
            contextStream
                .CrossApplyFolderFiles("列出所有的 zip 文件", "*.zip", true)
                .CrossApplyZipFiles("从 zip 解压出 csv 文件", "*.csv")
                .CrossApplyTextFile("解析 csv ", 
                    FlatFileDefinition.Create(i => new Person
                    {
                        Email = i.ToColumn("email"),
                        FirstName = i.ToColumn("first name"),
                        LastName = i.ToColumn("last name"),
                        DateOfBirth = i.ToDateColumn("date of birth", "yyyy-MM-dd"),
                        Reputation = i.ToNumberColumn<int?>("reputation", ".")
                    }).IsColumnSeparated(','))
                .Distinct("去重", i => i.Email)
                .SqlServerSave("写入数据库", o => o
                    .ToTable("dbo.Person")
                    .SeekOn(p => p.Email)
                    .DoNotSave(p => p.Id))
                .Do("输出到控制台", i => Console.WriteLine(i.Id));
        }
        private class Person
        {
            public int Id { get; set; }
            public string Email { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public DateTime DateOfBirth { get; set; }
            public int? Reputation { get; set; }
        }
    }
}

用户评论