csvhelper 映射来自行中不同项目的字段
csvhelper mapping a field from a different item in the row
我从没有相同列的 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()
它只是忽略了我创建的类型转换器。
有没有更好的方法可以编写此转换器以使其工作?
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();
我从没有相同列的 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() 它只是忽略了我创建的类型转换器。 有没有更好的方法可以编写此转换器以使其工作?
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();