将 CsvReader 字段文本字段读入布尔字段?
Reading CsvReader field text field into Boolean field?
我刚开始使用 CsvReader
,使用起来很顺利。
我的对象目前有这些字段:
public class CLMExplorerStudent
{
[Name("Student ID")]
public int Id { get; set; }
[Name("Last Name")]
public string LastName { get; set; }
[Name("First Name")]
public string FirstName { get; set; }
[Name("Gender")]
public string Gender { get; set; }
[Name("Active")]
public string Active { get; set; }
[Name("Role")]
public string Role { get; set; }
[Name("Use For")]
public string UseFor { get; set; }
[Name("Use Where")]
public string UseWhere { get; set; }
[Name("Email Address")]
public string EmailAddress { get; set; }
[Name("Phone #")]
public string PhoneNumber { get; set; }
[Name("Remarks")]
public string Remarks { get; set; }
}
Active
字段在 CSV 文件中的值为 Y
或 N
。是否可以将其映射,以便我的 class 中的 属性 可以是 bool
属性?
我正在使用读取 CSV 文件的标准方法:
using (var reader = new StreamReader(strPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<CLMExplorerStudent>();
}
我显然知道我可以简单地根据 Y
或 N
测试值,但我更愿意读入 bool
属性.
我只需要从 CSV 文件中读入,而不需要写出。
实现自定义类型转换器并使用 [TypeConverter]
属性注册它:
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;
using CsvHelper.TypeConversion;
class YesNoConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
=> "YES".StartsWith(text, StringComparison.OrdinalIgnoreCase);
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
=> value is bool b && b ? "Y" : "N";
}
public class CLMExplorerStudent
{
// ...
[Name("Active")]
[TypeConverter(typeof(YesNoConverter))]
public bool Active { get; set; }
// ...
}
我也找到了这个页面:https://joshclose.github.io/CsvHelper/examples/configuration/attributes/
建议的地方:
[BooleanTrueValues("yes")]
[BooleanFalseValues("no")]
public bool IsBool { get; set; }
所以:
[BooleanTrueValues("Y")]
[BooleanFalseValues("N")]
public bool Active{ get; set; }
我刚开始使用 CsvReader
,使用起来很顺利。
我的对象目前有这些字段:
public class CLMExplorerStudent
{
[Name("Student ID")]
public int Id { get; set; }
[Name("Last Name")]
public string LastName { get; set; }
[Name("First Name")]
public string FirstName { get; set; }
[Name("Gender")]
public string Gender { get; set; }
[Name("Active")]
public string Active { get; set; }
[Name("Role")]
public string Role { get; set; }
[Name("Use For")]
public string UseFor { get; set; }
[Name("Use Where")]
public string UseWhere { get; set; }
[Name("Email Address")]
public string EmailAddress { get; set; }
[Name("Phone #")]
public string PhoneNumber { get; set; }
[Name("Remarks")]
public string Remarks { get; set; }
}
Active
字段在 CSV 文件中的值为 Y
或 N
。是否可以将其映射,以便我的 class 中的 属性 可以是 bool
属性?
我正在使用读取 CSV 文件的标准方法:
using (var reader = new StreamReader(strPath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<CLMExplorerStudent>();
}
我显然知道我可以简单地根据 Y
或 N
测试值,但我更愿意读入 bool
属性.
我只需要从 CSV 文件中读入,而不需要写出。
实现自定义类型转换器并使用 [TypeConverter]
属性注册它:
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;
using CsvHelper.TypeConversion;
class YesNoConverter : DefaultTypeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
=> "YES".StartsWith(text, StringComparison.OrdinalIgnoreCase);
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
=> value is bool b && b ? "Y" : "N";
}
public class CLMExplorerStudent
{
// ...
[Name("Active")]
[TypeConverter(typeof(YesNoConverter))]
public bool Active { get; set; }
// ...
}
我也找到了这个页面:https://joshclose.github.io/CsvHelper/examples/configuration/attributes/
建议的地方:
[BooleanTrueValues("yes")]
[BooleanFalseValues("no")]
public bool IsBool { get; set; }
所以:
[BooleanTrueValues("Y")]
[BooleanFalseValues("N")]
public bool Active{ get; set; }