Предположим, у вас есть файл CSV со следующей структурой
LINE1: ID,Description,Value
LINE2: 1,Product1,2
LINE3: ,,3
LINE4: ,,4
LINE5: 2,Product2,2
LINE6: ,,3
LINE7: ,,5
с соответствующим FileHelpers
классом определения
[DelimitedRecord(",") ]
[IgnoreFirst(1)]
public class Product
{
public int ID { get; set; }
public string Description { get; set; }
[FieldConverter(ConverterKind.Decimal)]
public decimal Val{ get; set; }
}
Как использовать FileHelpers ,вернуть объекты так, чтобы каждый объект был полностью заполнен?
Позвольте мне уточнить, в настоящее время, результат использования engine.ReadFile
будет производить только объекты со строк 2 и 5 как полностью заполненные, что имеет смысл, так как поля являются пустыми,Однако объекты из строк 3 и 4 также должны иметь те же ID
и Description
, что и строка 1. Поле Value
должно оставаться нетронутым для каждой строки.Я не уверен, каков правильный термин для данных, но он, кажется, «частично нормализован».
Мой текущий подход к решению этой проблемы заключается в следующем, используя событие AfterRead
.Я плохо разбираюсь в событиях, обработчиках событий, делегатах и т. Д., Поэтому я ищу альтернативный способ достижения этого с помощью FileHelpers.Это также кажется очень неуклюжим.
// call the csv repo using the ffg lines within a console app
var repo2 = new CSVRepositoryBase<Product>();
repo2.AfterRead +=new AfterReadHandler<object>(repo2_AfterRead);
var products = repo2.Read("some file path");
public static Product PreviousRecord { get; set; }
private static void repo2_AfterRead
(EngineBase engine, FileHelpers.Events.AfterReadEventArgs<object> e)
{
var record = (Product)e.Record;
if (PreviousRecord == null)
{
PreviousRecord = new Product();
PreviousRecord.ID = record.ID;
}
if (String.IsNullOrEmpty(record.ID)) // newline record = blank row
{
record.ID = PreviousRecord.ID;
}
PreviousRecord.ID = record.ID;
}
public class CSVRepositoryBase<T> where T : class
{
// shorten for brevity
public IEnumerable<T> Read(string fileName){/*snip*/ }
#region Events
public event AfterReadHandler<object> AfterRead
{
add { engine.AfterReadRecord += value; }
remove { engine.AfterReadRecord -= value; }
}
#endregion
}