C#实现批量读取学生成绩文件并计算平均分功能咨询
C# 批量提取学生期末成绩并计算平均分实现思路
核心实现步骤
获取目标文件夹下的所有TXT文件
使用Directory.GetFiles方法筛选指定文件夹内的.txt文件,推荐结合FolderBrowserDialog让用户选择目标文件夹(避免硬编码路径),示例代码:// 通过FolderBrowserDialog获取用户选择的文件夹路径 using var folderDialog = new FolderBrowserDialog(); if (folderDialog.ShowDialog() != DialogResult.OK) return; var txtFiles = Directory.GetFiles(folderDialog.SelectedPath, "*.txt", SearchOption.TopDirectoryOnly);读取文件并提取期末成绩
先明确TXT文件中成绩的存储格式(比如固定关键词行、特定位置行),再编写解析逻辑:
假设文件中存在类似期末成绩:85的行,可通过以下方式提取数值:var scores = new List<double>(); foreach (var filePath in txtFiles) { try { var lines = File.ReadAllLines(filePath); foreach (var line in lines) { if (line.Contains("期末成绩:")) { // 分割字符串提取成绩部分并转换为数字 var scoreStr = line.Split(':')[1].Trim(); if (double.TryParse(scoreStr, out var score)) { scores.Add(score); } break; // 找到成绩后跳出当前文件的行循环 } } } catch (Exception ex) { // 记录错误,可在TextBox中提示异常文件 textBoxResult.Text += $"读取文件 {Path.GetFileName(filePath)} 出错:{ex.Message}\r\n"; } }注:如果成绩存储格式不同(比如单独一行、固定位置),只需调整行筛选和数值提取的逻辑即可。
计算平均分并显示结果
先判断有效成绩数量,避免除以0的异常,再计算平均分并输出到TextBox:if (scores.Count > 0) { var averageScore = scores.Average(); // 保留两位小数显示 textBoxResult.Text += $"期末成绩平均分:{averageScore:F2}\r\n"; } else { textBoxResult.Text = "未找到有效期末成绩数据"; }
优化建议
- 异步处理:当文件数量上千时,用
await Task.Run(() => { /* 批量处理逻辑 */ })包裹文件读取和解析代码,避免UI线程卡顿。 - 错误日志:可将读取失败的文件信息记录到日志文件,方便后续排查问题。
- 格式兼容:如果不同文件的成绩格式有差异,可增加多种解析规则的判断,提升兼容性。
内容的提问来源于stack exchange,提问作者Seb Tardif
相关产品推荐
相关产品推荐

