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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:04