【问题标题】:csvhelper mapping a field from a different item in the rowcsvhelper 从行中的不同项目映射字段
【发布时间】:2020-10-10 14:14:15
【问题描述】:

我从不具有相同列的 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();

通过添加 Optional() 它只是忽略了我创建的类型转换器。 有没有更好的方法可以编写此转换器以使其工作?

【问题讨论】:

    标签: c# csvhelper


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2013-05-15
      • 2020-10-27
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多