Blazor父组件向子控件传递Type类型,CsvHelper读取数据为空
解决CsvHelper GetRecords返回空数据的问题
问题根源
你调用了reader.ReadToEnd()输出CSV内容,这个操作会将StreamReader的读取指针移动到流的末尾,后续CsvReader再读取时,流里已经没有剩余数据了,所以GetRecords返回空集合。
另外,代码里Type.GetType(csvRows.FullName)是多余的——你已经通过组件参数拿到了csvRows这个Type实例,直接用它就行,没必要再通过FullName重新获取。
修复方案
方案1:调整日志输出位置
把读取并打印CSV内容的代码移到CsvReader处理完成之后,避免提前消耗流:
using (StreamReader reader = new StreamReader(ms)) { CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture); var csvReords = csv.GetRecords(csvRows); // 直接使用传入的Type实例 Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()}"); Console.WriteLine($"Serialize {System.Text.Json.JsonSerializer.Serialize(csvReords)}"); // 打印CSV内容(需要重置流位置) ms.Seek(0, SeekOrigin.Begin); Console.WriteLine($"StreamReader {reader.ReadToEnd()}"); }
方案2:读取后重置流指针
如果必须先打印CSV内容,在调用ReadToEnd()后,将流的位置重置到起始处,再创建CsvReader:
using (StreamReader reader = new StreamReader(ms)) { Console.WriteLine($"StreamReader {reader.ReadToEnd()}"); ms.Seek(0, SeekOrigin.Begin); // 重置流到起始位置 reader.DiscardBufferedData(); // 清空StreamReader的缓存 CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture); var csvReords = csv.GetRecords(csvRows); Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()}"); Console.WriteLine($"Serialize {System.Text.Json.JsonSerializer.Serialize(csvReords)}"); }
额外注意事项
- 确保你的
CsvRows类的属性名称和CSV文件的列名匹配(或者通过CsvHelper的特性配置映射关系),否则CsvHelper无法正确解析数据。 GetRecords返回的是延迟加载的枚举,调用Count()会触发实际读取,如果你后续还要使用数据,建议提前转成List:var csvRecords = csv.GetRecords(csvRows).ToList();
内容的提问来源于stack exchange,提问作者Prashant Khamkar
相关产品推荐
相关产品推荐

