You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CsvHelper解析CSV生成类对象数组无结果,求排查原因

CsvHelper解析CSV返回空数组的解决办法

我之前也碰到过一模一样的问题!你这里的核心问题其实很容易忽略:当你调用reader.ReadToEnd()读取完整个CSV内容后,流的指针已经移动到了文件末尾,这时候再把这个reader传给CsvReader,它根本读不到任何数据,自然返回空数组了。

先确认下你的实体类定义没问题(属性名要和CSV列名对应),比如应该是这样的:

public class TestCsvEntity
{
    public int RowNumber { get; set; }
    public string Value { get; set; }
}

接下来给你两种可行的解决办法:

办法一:直接用流读取,不提前ReadToEnd()

如果不需要提前获取CSV的字符串内容,直接把File.OpenText返回的reader传给CsvReader就行,这是最简洁的方式:

using (var reader = File.OpenText("test.csv"))
{
    var csvReader = new CsvReader(reader);
    TestCsvEntity[] resultReader = csvReader.GetRecords<TestCsvEntity>().ToArray();
}

办法二:如果必须提前读取内容,重置流或重新创建读取器

如果你确实需要先获取CSV的字符串内容,有两种方式处理:

方式1:重置流的位置

把流的指针重新移到开头,并清除缓存,这样CsvReader就能从头读取了:

var reader = File.OpenText("test.csv");
string stringResult = reader.ReadToEnd();

// 重置流到起始位置
reader.BaseStream.Position = 0;
// 清除reader的缓存数据
reader.DiscardBufferedData();

var csvReader = new CsvReader(reader);
TestCsvEntity[] resultReader = csvReader.GetRecords<TestCsvEntity>().ToArray();

方式2:用StringReader重新读取已获取的字符串

把已经读到的stringResult放到StringReader里,再传给CsvReader,这样相当于重新创建了一个从头开始的读取器:

string stringResult;
using (var reader = File.OpenText("test.csv"))
{
    stringResult = reader.ReadToEnd();
}

// 用StringReader包装已读取的字符串
using (var stringReader = new StringReader(stringResult))
{
    var csvReader = new CsvReader(stringReader);
    TestCsvEntity[] resultReader = csvReader.GetRecords<TestCsvEntity>().ToArray();
}

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:33:24