C# csvHelper 读取

测试类

public class Student
{
    public int ID { get; set; }

    public string Name { get; set; }
}

csv 文件数据

ID,Name
1,Tom
2,Jerry
3,ma
4,le
5,ma

读取所有记录

using (var reader = new StreamReader("malema-student.csv"))
{
    // 其它国家如荷兰要用 new CultureInfo("nl-nl")
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) 
    {
        var records = csv.GetRecords<Student>();
    }
}

读取 csv 文件时,空行将被忽略,若空行中包含空格,将报错。 如果是 Excel 编辑的 CSV 文件,空行将会变成仅包含分隔符 , 的行,也会报错。 数据量不大的情况下,直接用这个。

把数据读到到出来后,我们如果要过滤数据的话就可以用Linq来做数据的处理非常的方便

逐条读取

using (var reader = new StreamReader("malema-student.csv"))
{
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        while (csv.Read())
        {
            var record = csv.GetRecord<Student>();
        }
    }
}

GetRecords 方法通过 yield 返回一个 IEnumerable,并不会将内容一次全部读进内存,除非调用了 ToList 或 ToArray 方法。 所以这种逐条读取的写法没有太多必要。

读取单个字段

using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    csv.Read();
    csv.ReadHeader();

    while (csv.Read())
    {
        var id = csv.GetField<int>(0);
        var name = csv.GetField<string>("Name");
    }
}

逐行读取时,可以不管标题行,但是,这里不行。

csv.Read(); 这句是读取标题,如果没有的话,while 循环第一次取到的是标题,肯定会报错。

csv.ReadHeader(); 这句是给标题赋值,如果没有的话,csv.GetField("Name") 会报找不到标题。

使用 TryGetField 可以防止意外的报错。

csv.TryGetField(0, out int id);

上一篇:csv简介
最近更新的
...