如何通过 CSV Helper 将 CSV 解析为我的自定义类 IFormFile .Net Core c#

问题描述

我正在将 CSV 文件从客户端上传到 .NET CORE Web Api 应用。

我正在使用 CsvHelper .net 库。

我成功接收文件,我想将其解析为我的自定义类,以便我可以遍历来自 csv 的行。

但是每次我得到 Empty 结果就像没有行一样。

我不确定我的方法有什么问题:

[HttpPost("import")]
public async Task<ActionResult> ImportData([FromForm] IFormFile file)
{

    using var memoryStream = new MemoryStream(new byte[file.Length]);
    await file.copyToAsync(memoryStream);
    memoryStream.Position = 0;

    using (var reader = new StreamReader(memoryStream))
    using (var csvReader = new CsvReader(reader,System.Globalization.CultureInfo.InvariantCulture))
    {
        csvReader.Read();
        var records = csvReader.GetRecords<SiteDto>();
    }

    return Ok("ok");
}

这是我的 CSV 文件的样子:

enter image description here

我的网站 Dto:

public class SiteDto
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string CompanyName { get; set; }
    public string Location { get; set; }
}

当我展开我的结果时,我看到了类似关于某些标题的警告?

enter image description here

解决方法

https://joshclose.github.io/CsvHelper/getting-started

GetRecords 方法将返回一个 IEnumerable,它将产生 记录。这意味着只返回一条记录 迭代记录的时间。

尝试调用 ToList() 来迭代记录并删除 csvReader.Read();GetRecords() 在内部调用 Read()。使用两者会导致 CsvReader 跳过标题行。

using (var reader = new StreamReader(memoryStream))
using (var csvReader = new CsvReader(reader,System.Globalization.CultureInfo.InvariantCulture))
{
    var records = csvReader.GetRecords<SiteDto>().ToList();
}

还要为您的类添加一个 name 属性,以便 CsvHelper 知道如何映射 Id 属性。

public class SiteDto
{
    [Name("SiteId")]
    public long Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string CompanyName { get; set; }
    public string Location { get; set; }
}