使用CsvHelper解析字符串为令牌列表遇文件找不到错误的问询
解决CsvHelper传入字符串却报“文件找不到”的问题
核心问题原因
你的C#代码错误使用了StreamReader的构造函数:StreamReader(string path)是接收文件路径的,而非直接读取字符串内容。当你传入CSV文本时,它会把这段文本当作文件路径去查找,自然触发“文件找不到”的错误。
修正后的C#实现代码
将StreamReader替换为StringReader(专门用于读取字符串的TextReader实现),同时优化字段读取逻辑以适配任意列数:
public int ParseCSVText(string textToParse, string delimiter, out string[] tokens) { var listTokens = new List<string>(); // 使用StringReader处理字符串内容,而非StreamReader(用于文件读取) using (var stringReader = new StringReader(textToParse)) { var config = new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = delimiter, HasHeaderRecord = false }; using (var reader = new CsvReader(stringReader, config)) { while (reader.Read()) { // 动态遍历当前行的所有字段,避免硬编码索引 for (int i = 0; i < reader.Context.Record.Length; i++) { listTokens.Add(reader.GetField(i)); } } } } tokens = listTokens.ToArray(); return listTokens.Count; }
关键优化点说明
- 替换读取器类型:
StringReader是.NET专门为字符串读取设计的类,完美匹配你传入CSV文本的需求,而StreamReader仅用于文件或流的读取。 - 动态读取字段:原代码硬编码了字段索引(0到4),如果CSV列数变化会直接报错,改用遍历
reader.Context.Record.Length的方式可以适配任意列数的CSV行。 - 简化配置初始化:使用对象初始化器创建
CsvConfiguration,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

