petersondrew / FlatFile

FlatFile is a library to work with flat files

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FlatFile

Build status Bitdeli Badge

FlatFile is a library to work with flat files (work up-to 100 times faster then FileHelpers)

Installing FlatFile

Installing all packages

You should install FlatFile with NuGet:

Install-Package FlatFile

Installing FlatFile.Delimited

You should install FlatFile.Delimited with NuGet:

Install-Package FlatFile.Delimited
Add attribute-mapping extensions

You should install FlatFile.Delimited.Attributes with NuGet:

Install-Package FlatFile.Delimited.Attributes

Installing FlatFile.FixedLength

You should install FlatFile.FixedLength with NuGet:

Install-Package FlatFile.FixedLength
Add attribute-mapping extensions

You should install FlatFile.FixedLength.Attributes with NuGet:

Install-Package FlatFile.FixedLength.Attributes

This commands from Package Manager Console will download and install FlatFile and all required dependencies.

Benchmarks

Simple write

Name Milliseconds Percent
FileHelperEngine.WriteStream 5175 11266.8%
FlatFileEngine.Write 45 100%

Simple read

Name Milliseconds Percent
FileHelperEngine.ReadStream 7636 2764.4%
FlatFileEngine.Read 276 100%

Big (100000 entities) write

Name Milliseconds Percent
FileHelperEngine.WriteStream 17246 838.4%
FlatFileEngine.Write 2057 100%

Big (100000 entities) write with reflection magic

Name Milliseconds Percent
FileHelperEngine.WriteStream 17778 1052.5%
FlatFileEngine.Write 1689 100%

FlatFile vs CsvHelper

Write all records with class mapping
Name Milliseconds Percent
CsvWriter.WriteRecords 26578 7988.8%
FlatFileEngine.Write 332 100%
Read all records with class mapping
Name Milliseconds Percent
CsvWriter.WriteRecords 18795 3190.5%
FlatFileEngine.Write 589 100%

Usage

Class mapping

DelimitedLayout
public sealed class DelimitedSampleRecordLayout : DelimitedLayout<FixedSampleRecord>
{
    public DelimitedSampleRecordLayout()
    {
        this.WithDelimiter(";")
            .WithQuote("\"")
            .WithMember(x => x.Cuit)
            .WithMember(x => x.Nombre)
            .WithMember(x => x.Actividad, c => c.WithName("AnotherName"));
    }
}
FixedLayout
public sealed class FixedSampleRecordLayout : FixedLayout<FixedSampleRecord>
{
    public FixedSampleRecordLayout()
    {
        this.WithMember(x => x.Cuit, c => c.WithLenght(11))
            .WithMember(x => x.Nombre, c => c.WithLenght(160))
            .WithMember(x => x.Actividad, c => c.WithLenght(6));
    }
}

Run-time mapping

DelimitedLayout
public class LayoutFactory
{
    public IDelimitedLayout<TestObject> GetLayout()
    {
        IDelimitedLayout<TestObject> layout = new DelimitedLayout<TestObject>()
            .WithDelimiter(";")
            .WithQuote("\"")
            .WithMember(o => o.Id)
            .WithMember(o => o.Description)
            .WithMember(o => o.NullableInt, set => set.AllowNull("=Null"));

        return layout;
    } 
}
FixedLayout
public class LayoutFactory
{
    public IFixedLayout<TestObject> GetLayout()
    {
        IFixedLayout<TestObject> layout = new FixedLayout<TestObject>()
            .WithMember(o => o.Id, set => set
                .WithLenght(5)
                .WithLeftPadding('0'))
            .WithMember(o => o.Description, set => set
                .WithLenght(25)
                .WithRightPadding(' '))
            .WithMember(o => o.NullableInt, set => set
                .WithLenght(5)
                .AllowNull("=Null")
                .WithLeftPadding('0'));

        return layout;
    }

Attribute mapping

Delimited
using FlatFile.Delimited.Attributes;

[DelimitedFile(Delimiter = ";", Quotes = "\"")]
public class TestObject
{
    [DelimitedField(1)]
    public int Id { get; set; }

    [DelimitedField(2)]
    public string Description { get; set; }

    [DelimitedField(3, NullValue = "=Null")]
    public int? NullableInt { get; set; }
}
Fixed
using FlatFile.FixedLength;
using FlatFile.FixedLength.Attributes;

[FixedLengthFile]
public class TestObject
{
    [FixedLengthField(1, 5, PaddingChar = '0')]
    public int Id { get; set; }

    [FixedLengthField(2, 25, PaddingChar = ' ', Padding = Padding.Right)]
    public string Description { get; set; }

    [FixedLengthField(2, 5, PaddingChar = '0', NullValue = "=Null")]
    public int? NullableInt { get; set; }
}

Read from stream

With layout
var layout = new FixedSampleRecordLayout();
var factory = new FixedLengthFileEngineFactory();
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(FixedFileSample)))
{
    var flatFile = factory.GetEngine<FixedSampleRecord>(layout);

    var records = flatFile.Read(stream).ToArray();
}
With attribute-mapping
var factory = new FixedLengthFileEngineFactory();
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(FixedFileSample)))
{
    var flatFile = factory.GetEngine<FixedSampleRecord>();

    var records = flatFile.Read(stream).ToArray();
}

Write to stream

With layout
var sampleRecords = GetRecords();
var layout = new FixedSampleRecordLayout();
var factory = new FixedLengthFileEngineFactory();
using (var stream = new MemoryStream())
{
    var flatFile = factory.GetEngine<FixedSampleRecord>(layout);

    flatFile.Write(stream, sampleRecords);
}
With attribute-mapping
var sampleRecords = GetRecords();
var factory = new FixedLengthFileEngineFactory();
using (var stream = new MemoryStream())
{
    var flatFile = factory.GetEngine<FixedSampleRecord>();

    flatFile.Write(stream, sampleRecords);
}

About

FlatFile is a library to work with flat files

License:MIT License


Languages

Language:C# 95.9%Language:PowerShell 3.8%Language:Shell 0.4%