如何将List<Student>列表写入CSV文件并读取还原为原类型列表
C# 自定义Student列表与CSV文件读写实现
写入CSV文件
先实现写入逻辑,自带CSV字段转义,兼容字段含逗号、引号的特殊场景:
using System.IO; using System.Collections.Generic; using System.Linq; using System.Text; // 写入List<Student>到指定CSV路径 public void WriteStudentsToCsv(List<Student> students, string filePath) { var csvLines = new List<string> { // 写入表头 "studentID,studentName,studentAge" }; // 遍历学生列表拼接CSV行 csvLines.AddRange(students.Select(student => $"{EscapeCsvField(student.studentID)},{EscapeCsvField(student.studentName)},{EscapeCsvField(student.studentAge)}" )); // 写入文件,用UTF8编码避免中文乱码 File.WriteAllLines(filePath, csvLines, Encoding.UTF8); } // CSV字段转义方法,处理特殊字符 private string EscapeCsvField(string field) { if (string.IsNullOrEmpty(field)) return string.Empty; if (field.Contains(',') || field.Contains('"') || field.Contains('\n')) { return $"\"{field.Replace("\"", "\"\"")}\""; } return field; }
从CSV读取还原为Student列表
实现解析逻辑,自动处理转义后的字段:
// 从CSV路径读取数据还原为List<Student> public List<Student> ReadStudentsFromCsv(string filePath) { var students = new List<Student>(); if (!File.Exists(filePath)) return students; // 读取所有行并跳过表头 var csvLines = File.ReadAllLines(filePath, Encoding.UTF8).Skip(1); foreach (var line in csvLines) { if (string.IsNullOrWhiteSpace(line)) continue; var fields = ParseCsvLine(line); if (fields.Length < 3) continue; students.Add(new Student { studentID = fields[0], studentName = fields[1], studentAge = fields[2] }); } return students; } // 解析单条CSV行,处理转义逻辑 private string[] ParseCsvLine(string line) { var fields = new List<string>(); var currentField = new StringBuilder(); bool inQuotes = false; for (int i = 0; i < line.Length; i++) { char c = line[i]; if (c == '"') { if (inQuotes && i + 1 < line.Length && line[i + 1] == '"') { currentField.Append('"'); i++; } else { inQuotes = !inQuotes; } } else if (c == ',' && !inQuotes) { fields.Add(currentField.ToString()); currentField.Clear(); } else { currentField.Append(c); } } fields.Add(currentField.ToString()); return fields.ToArray(); }
调用示例
和你现有的代码完全兼容:
// 你的原有学生列表构造逻辑 List<Student> students = new List<Student>(); Student newstudent = new Student(); newstudent.studentID = txt_sID.Text; newstudent.studentName = txt_sName.Text; newstudent.studentAge = txt_sAge.Text; students.Add(newstudent); // 写入CSV WriteStudentsToCsv(students, @"D:\students.csv"); // 读取还原 List<Student> loadedStudents = ReadStudentsFromCsv(@"D:\students.csv");
注意说明
- 以上是原生实现,不需要引入任何第三方依赖
- 内置的转义和解析逻辑可以避免字段含特殊字符时的行列错位问题
- 如果项目允许引入第三方包,也可以用CsvHelper等库进一步简化代码
内容的提问来源于stack exchange,提问作者ItsDano
相关产品推荐
相关产品推荐

