问题描述
我正在将 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 文件的样子:
我的网站 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; }
}
当我展开我的结果时,我看到了类似关于某些标题的警告?
解决方法
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; }
}