csvhelper - 返回时处理 CsvHelper.GetRecords
问题描述
我想从工作代码中提取一个方法。在这个函数中,我可以访问记录。但是在返回时,记录的内容会被处理掉。因此,我尝试将 csv.GetRecords() 转换为 List,但出现错误消息,因为记录仅包含方法 Equals()、GetEnumerator()、GetHasCode()、GetType() 和 ToString()。我快疯了:/有人可以帮助我吗?谢谢。
private static IEnumerable<Animal> LoadFromCsvFile(/*[ExistingFile]*/ string fileName, Encoding encodingFormat, char separator)
{
using (var reader = new StreamReader(fileName))
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<AnimalClassMap>();
csv.Configuration.Delimiter = separator.ToString(CultureInfo.InvariantCulture);
csv.Configuration.Encoding = encodingFormat;
IEnumerable<Animal> records = csv.GetRecords<Animal>();
foreach (Animal rec in records)
{
Console.WriteLine($"{rec.FatherId}x{rec.MotherId} - {rec.Name} ({rec.Male}) breed {rec.Breed}");
}
return records;
}
}
解决方案
GetRecords<Animal>()
没有立即获得记录。它会在您迭代记录时产生结果。当您records
在迭代它们之前返回时,您会发现该CsvReader
上下文已经被释放并且不再yield
是结果。.ToList()
您可以通过在它离开 using 语句之前枚举所有记录来解决此问题。
IEnumerable<SccAnimal> records = csv.GetRecords<Animal>().ToList();
另一种选择是在方法中制作LoadFromCsvFile : IDisposable
然后处置StreamReader
和,而不是将它们放在语句中。在这种情况下,您将无法对其进行两次迭代。CsvReader
Dispose()
using
GetRecords 方法将返回将产生记录的 IEnumerable。这意味着在您迭代记录时一次只返回一条记录。这也意味着只有一小部分文件被读入内存。
推荐阅读
- c# - 为什么我的父窗口光标设置为等待?
- oracle - 如何在 XMLTYPE 中获取 & 值
- python - 从python中的任何文档制作单词列表
- python - 命令“python setup.py egg_info”失败,错误代码 1 在 /tmp/pip-install-_p77_6kw/poster/
- python - ImportError:没有名为 pynput.keyboard 的模块
- python-3.x - Web Scraping Python:没有从网页的下拉菜单中获取想要的数据
- kubernetes - CLI 命令到 REST API 请求的转换
- c# - 如何获得小于 100 兆字节的文件大小
- angular - Angular 7:如何提交文件/图像以及我的反应形式?
- angular - 量角器打字稿上的拖放操作出错,“{x: 540, y: 504}”类型的参数不可分配给“ILocation”类型的参数