Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make FileHelpers set the line number on each record?

Are there any chances to have the MultiRecordEngine set the line number for each record? I read the documentation and found that the Engine has a LineNumber property, but I couldn't find a way to use it.

What I would like to have: i.e.:

[FixedLengthRecord]
    public class Employee
    {
        public int LineNumber; // <-- setup by the engine while reading the file

        [FieldFixedLength(1)]
        public string Type = "2";

        [FieldFixedLength(6)]
        [FieldTrim(TrimMode.Left, "0")]
        public int ID;
     }

Or... can I rely on the index of the record in the collection created by the Engine.ReadFile? i.e.:

  static void Main(string[] args)
    {

        var engine = new MultiRecordEngine(CustomSelector, _types);
        var obj = engine.ReadFile("order.txt");

        // obj.GetValue(100) returns same record found on the 101th line in the file?
    }
like image 614
Alexander Avatar asked Jun 30 '14 14:06

Alexander


1 Answers

You can use the AfterReadRecord event to set the LineNumber property.

Here is a working example

public class Employee
{
    [FieldIgnored]
    public int LineNumber; // <-- setup by the engine while reading the file

    [FieldFixedLength(1)]
    public string Type = "2";

    [FieldFixedLength(6)]
    [FieldTrim(TrimMode.Left, "0")]
    public int ID;
}

class Program
{
    static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Employee>();
        engine.AfterReadRecord += engine_AfterReadRecord;
        Employee[] records = engine.ReadString("2000003" + Environment.NewLine 
                                             + "5000006");

        Employee firstRecord = records[0];
        Assert.AreEqual(1, firstRecord.LineNumber);
        Assert.AreEqual("2", records[0].Type);
        Assert.AreEqual(3, records[0].ID);

        Employee secondRecord = records[1];
        Assert.AreEqual(2, secondRecord.LineNumber);
        Assert.AreEqual("5", records[1].Type);
        Assert.AreEqual(6, records[1].ID);

        Console.Read();
    }

    static void engine_AfterReadRecord(EngineBase engine, AfterReadEventArgs<Employee> e)
    {
        e.Record.LineNumber = engine.LineNumber;
    } 
}
like image 162
shamp00 Avatar answered Oct 22 '22 19:10

shamp00