编写时转换或过滤CsvHelper中的成员
Convert or filter members in CsvHelper when writing
想象一下我有一个这样的class
public class DataGroup
{
public string DataA { get; set; }
public string DataB { get; set; }
public bool Updated { get; set; }
}
DataA
需要写一个空字符串或者"N/A"
,Updated == false
需要写DataB
,Updated == true
需要写一个实际值;
这可以用 CsvHelper 实现吗?
类型转换似乎不起作用,因为它只访问最终成员,因此无法读取 Updated
的值。
MapMember
class 有一个 Conversion
方法,但它似乎只适用于阅读。
if(Updated == false)
{
DataA = "N/A";
DataB = "N/A";
}
else
{
DataA = "Actual Information";
DataB = "Actual Information";
}
您可以将类型设置为空,而不是“N/A”
您可以使用Convert
方法。此方法可能有点令人困惑,因为它可以 ConvertFromString
或 ConvertToString
,具体取决于您的使用方式。
ConvertFromString 将Row
与CsvReader
结合使用
Map(m => m.DataA).Convert(m => m.Row.GetField("DataA") + m.Row.GetField("Updated"));
ConvertToString 将Value
与CsvWriter
结合使用
Map(m => m.DataA).Convert(m => m.Value.DataA + m.Value.Updated);
你想要ConvertToString
,所以你的ClassMap
可能是这样的。
public class DataGroupMap : ClassMap<DataGroup>
{
public DataGroupMap()
{
Map(m => m.DataA).Convert(m =>
{
if (m.Value.Updated) { return m.Value.DataA; }
return "N/A";
});
Map(m => m.DataB).Convert(m =>
{
if (m.Value.Updated) { return m.Value.DataB; }
return "N/A";
});
Map(m => m.Updated);
}
}
想象一下我有一个这样的class
public class DataGroup
{
public string DataA { get; set; }
public string DataB { get; set; }
public bool Updated { get; set; }
}
DataA
需要写一个空字符串或者"N/A"
,Updated == false
需要写DataB
,Updated == true
需要写一个实际值;
这可以用 CsvHelper 实现吗?
类型转换似乎不起作用,因为它只访问最终成员,因此无法读取 Updated
的值。
MapMember
class 有一个 Conversion
方法,但它似乎只适用于阅读。
if(Updated == false)
{
DataA = "N/A";
DataB = "N/A";
}
else
{
DataA = "Actual Information";
DataB = "Actual Information";
}
您可以将类型设置为空,而不是“N/A”
您可以使用Convert
方法。此方法可能有点令人困惑,因为它可以 ConvertFromString
或 ConvertToString
,具体取决于您的使用方式。
ConvertFromString 将Row
与CsvReader
Map(m => m.DataA).Convert(m => m.Row.GetField("DataA") + m.Row.GetField("Updated"));
ConvertToString 将Value
与CsvWriter
Map(m => m.DataA).Convert(m => m.Value.DataA + m.Value.Updated);
你想要ConvertToString
,所以你的ClassMap
可能是这样的。
public class DataGroupMap : ClassMap<DataGroup>
{
public DataGroupMap()
{
Map(m => m.DataA).Convert(m =>
{
if (m.Value.Updated) { return m.Value.DataA; }
return "N/A";
});
Map(m => m.DataB).Convert(m =>
{
if (m.Value.Updated) { return m.Value.DataB; }
return "N/A";
});
Map(m => m.Updated);
}
}