Index 特性用于标记字段顺序。
在读取文件时,如果没有标题,就只能通过顺序来确定字段。
public class Student
{
[Index(0)]
public int ID { get; set; }
[Index(1)]
public string Name { get; set; }
}
using (var reader = new StreamReader("malema-student.csv"))
{
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Configuration.HasHeaderRecord = false;
var records = csv.GetRecords<Student>().ToList();
}
}
csv.Configuration.HasHeaderRecord = false 配置告知 CsvReader 没有标题。必须要加这一行,否则会默认第一行为标题而跳过,导致最后的结果中少了一行。如果数据量比较多,会很难发现这个 bug。
在写入文件的时候,会按 Index 顺序写入。如果不想写入标题,也需要添加 csv.Configuration.HasHeaderRecord = false;
如果字段名称和列名不一致,可以使用 Name 属性。
public class Student
{
[Name("id")]
public int ID { get; set; }
[Name("名字")]
public string Name { get; set; }
}
NameIndex 用于处理 CSV 文件中的同名列。
public class Student
{
[Name("Name")]
[NameIndex(0)]
public string FirstName { get; set; }
[Name("Name")]
[NameIndex(1)]
public string LastName { get; set; }
}
忽略字段
读取时如果找不到匹配的字段,则忽略。
public class Student
{
...
[Optional]
public string Remarks { get; set; }
}
当读取的字段为空时 Default 特性可为其指定默认值。
Default 特性仅在读取时有效,写入时是不会将空值替换为默认值写入的。
public class Student
{
...
[NullValues("None", "none", "Null", "null")]
public string None { get; set; }
}
读取文件时,若 CSV 文件中某字段的值为空,那么读取后的值是 "",而非 null,标记 NullValues 特性后,若 CSV 文件中的某字段值为 NullValues 指定的值,则读取后为 null。
若同时标记了 Default 特性,则此特性不起作用。
坑爹的是,在写入文件时,此特性并不起作用。因此会引起读写不一致的问题。
Constant 特性为字段指定一个常量值,读写时都使用此值,无论指定了什么其他映射或配置。
Format 指定类型转换时使用的字符串格式。
例如数字和时间类型,我们经常会指定其格式。
public class Student
{
...
[Format("0.00")]
public decimal Amount { get; set; }
[Format("yyyy-MM-dd HH:mm:ss")]
public DateTime JoinTime { get; set; }
}
这两个特性用于将 bool 转换成指定的形式显示。
public class Student
{
...
[BooleanTrueValues("yes")]
[BooleanFalseValues("no")]
public bool Vip { get; set; }
}
public class Student
{
...
[Format("X2")]
[NumberStyles(NumberStyles.HexNumber)]
public int Data { get; set; }
}
比较有用是 NumberStyles.HexNumber 和 NumberStyles.AllowHexSpecifier,这两个枚举的作用差不多。此特性仅在读取时有效,写入时并不会转成 16 进制写入。这会导致读写不一致,可以用 Format 特性指定写入格式。
写一个中间类,把属性的类型变成string。读取之后自己再转换成想要的类型。 写入的时候也自己转换成合适的string类型。