DEV Community

Naimul Karim
Naimul Karim

Posted on • Edited on

A Generic ETL (Extract, Transform, Load)

Project Structure

1. Interfaces

public interface IExtractor<T>
{
    IEnumerable<T> Extract();
}

public interface ITransformer<T>
{
    T Transform(T input);
}

public interface ILoader<T>
{
    void Load(IEnumerable<T> data);
}
Enter fullscreen mode Exit fullscreen mode

2. Generic ETL Engine

public class EtlEngine<T>
{
    private readonly IExtractor<T> _extractor;
    private readonly ITransformer<T> _transformer;
    private readonly ILoader<T> _loader;

    public EtlEngine(IExtractor<T> extractor, ITransformer<T> transformer, ILoader<T> loader)
    {
        _extractor = extractor;
        _transformer = transformer;
        _loader = loader;
    }

    public void Run()
    {
        var extracted = _extractor.Extract();
        var transformed = extracted.Select(item => _transformer.Transform(item)).ToList();
        _loader.Load(transformed);
    }
}

Enter fullscreen mode Exit fullscreen mode

3. Sample Implementation

Model

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Enter fullscreen mode Exit fullscreen mode

CSV Extractor

public class CsvExtractor : IExtractor<Person>
{
    private readonly string _filePath;

    public CsvExtractor(string filePath)
    {
        _filePath = filePath;
    }

    public IEnumerable<Person> Extract()
    {
        var lines = File.ReadAllLines(_filePath).Skip(1); // Skip header
        foreach (var line in lines)
        {
            var parts = line.Split(',');
            yield return new Person
            {
                Name = parts[0],
                Age = int.Parse(parts[1])
            };
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Transformer

public class PersonTransformer : ITransformer<Person>
{
    public Person Transform(Person input)
    {
        input.Name = input.Name.ToUpperInvariant();
        return input;
    }
}
Enter fullscreen mode Exit fullscreen mode

Loader (write to console or file)

public class ConsoleLoader : ILoader<Person>
{
    public void Load(IEnumerable<Person> data)
    {
        foreach (var person in data)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

4. Putting It All Together

class Program
{
    static void Main(string[] args)
    {
        var extractor = new CsvExtractor("people.csv");
        var transformer = new PersonTransformer();
        var loader = new ConsoleLoader();

        var engine = new EtlEngine<Person>(extractor, transformer, loader);
        engine.Run();
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)