csvhelper сопоставляет поле из другого элемента в строке

#c# #csvhelper

#c# #csvhelper

Вопрос:

Я импортирую записи из файлов csv, которые не имеют одинаковых столбцов. Я пытаюсь создать сопоставление, которое будет видеть, отсутствует ли столбец, а затем просматривает другой столбец и на основе этого создает значение для первого.

Я попробовал что-то вроде этого:

 Map(m => m.ImportNo).TypeConverter<PeriodConverter>();
Map(m => m.Period).Optional();
  

И:

 public class PeriodConverter : StringConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        if (String.IsNullOrWhiteSpace(text))
        {
            if (row.GetField("Period") == "08/2012 - 12/2012")
                return 1;
            else if (row.GetField("Period") == "01/2013 - 06/2013")
                return 2;
            else
                return 0;
        }
        
        return int.Parse(text);
    }
}
  

Но это не удается, так как нет столбца ImportNo.
С другой стороны, если я изменю код моего сопоставления на этот:

 Map(m => m.ImportNo).Optional().TypeConverter<PeriodConverter>();
Map(m => m.Period).Optional();
  

Добавив необязательный()
Он просто игнорирует созданный мной преобразователь типов.
Есть ли лучший способ, которым я мог бы написать этот конвертер, чтобы он работал?

Ответ №1:

ConvertUsing должно работать

 Map(m => m.ImportNo).ConvertUsing(row =>
{
    if(row.TryGetField("ImportNo", out int importNo))
    {
        return importNo;
    }
    
    if (row.GetField("Period") == "08/2012 - 12/2012")
        return 1;
    else if (row.GetField("Period") == "01/2013 - 06/2013")
        return 2;
    else
        return 0;                 
});
Map(m => m.Period).Optional();