Как я могу разделить строки с разными типами RowTypes, используя FileHelpers?

Например, у меня есть следующий файл test.txt с двумя строками:

Тип00007P 008 PPL

Тип00230J 190 1

И следующие классы в моем коде, чтобы использовать Nuget Rhino-ETL для вставки этих строк в мою БД:

public class Type00007P
{
    [FieldFixedLength(10)]
    [FieldTrim(TrimMode.Both)]
    public string TypeControl;

    [FieldFixedLength(3)]
    [FieldTrim(TrimMode.Both)]
    public int Id;

    [FieldFixedLength(3)]
    [FieldTrim(TrimMode.Both)]
    public string Name;
}


public class Type00230J
{
    [FieldFixedLength(10)]
    [FieldTrim(TrimMode.Both)]
    public string TypeControl;

    [FieldFixedLength(3)]
    [FieldTrim(TrimMode.Both)]
    public int Id;

    [FieldFixedLength(1)]
    [FieldTrim(TrimMode.Both)]
    public bool Calculated;
}

Если я использую следующий код для извлечения строк, я не могу различить строки Type00007P и строки Type00230J в одном и том же файле:

public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
    using (FileEngine file = FluentFile.For<Type00007P>().From(FilePath))
    {
        foreach (object obj in file)
        {
            yield return Row.FromObject(obj);
        }
    }
}

Затем, как я могу прочитать первое фиксированное поле, чтобы получить RowType, и после этого обработать всю строку с правильным классом?

С уважением!

1 ответ

Решение

Вы можете использовать MultiRecordEngine, Документация здесь.

var engine = new MultiRecordEngine(
    typeof(Type00007P),
    typeof(Type00230J));

engine.RecordSelector = new RecordTypeSelector(CustomSelector);

а затем определить CustomSelector,

private Type CustomSelector(MultiRecordEngine engine, string recordLine)
{
    if (recordLine.Length == 0)
        return null;

    if (recordLine.StartsWith("Type00007P")))
        return typeof(Type00007P);
    else
        return typeof(Type00230J);
}
Другие вопросы по тегам