Как я могу разделить строки с разными типами 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);
}