文件读写-成绩分析

65 阅读1分钟

1 计算每个同学的总分和平均分

2 统计每个科目的平均分

3 列出总分前3名和单科前3名,并保存结果到文件中

学生的成绩示例:

姓名,语文,数学,英语
张伟,87,92,88
李娜,90,85,95
王强,78,90,82

import java.io.{FileWriter, IOException}
import scala.io.Source
import scala.util.{Try, Using}

object ScoreAnalyzer {
  // 定义学生样例类
  case class Stu(name: String, yuwen: Double, shuxue: Double, yingyu: Double) {
    // 计算总分
    def total: Double = yuwen + shuxue + yingyu
    // 计算平均分
    def average: Double = total / 3
  }

  def main(args: Array[String]): Unit = {
    // 文件路径(建议使用相对路径或配置文件)
    val inputPath = "D:\24大数据1班\1\src\score.txt"
    val outputPath = "score_result.txt"

    try {
      // 读取文件并处理数据
      val stuList = Using(Source.fromFile(inputPath)) { source =>
        val lines = source.getLines()
        // 跳过表头
        if (lines.hasNext) lines.next()

        // 处理每一行数据
        lines.flatMap { line =>
          val parts = line.split(",").map(_.trim) // 去除空格
          // 数据校验
          if (parts.length != 4) {
            println(s"警告:数据格式错误,跳过此行: $line")
            None
          } else {
            Try {
              Stu(
                name = parts(0),
                yuwen = parts(1).toDouble,
                shuxue = parts(2).toDouble,
                yingyu = parts(3).toDouble
              )
            }.toOption
          }
        }.toList
      }.getOrElse {
        println("错误:读取文件失败")
        List.empty[Stu]
      }

      if (stuList.isEmpty) {
        println("错误:没有有效数据")
        return
      }

      // 计算各科统计信息
      val englishAvg = stuList.map(_.yingyu).sum / stuList.size
      val mathAvg = stuList.map(_.shuxue).sum / stuList.size
      val chineseAvg = stuList.map(_.yuwen).sum / stuList.size

      val englishMax = stuList.maxBy(_.yingyu)
      val mathMax = stuList.maxBy(_.shuxue)
      val chineseMax = stuList.maxBy(_.yuwen)

      // 写入结果文件(使用Using自动关闭资源)
      Using(new FileWriter(outputPath)) { writer =>
        // 写入每个学生的详细信息
        stuList.foreach { stu =>
          writer.write(
            s"${stu.name},语文:${stu.yuwen}分,数学:${stu.shuxue}分,英语:${stu.yingyu}分,总分:${stu.total},平均分:${"%.2f".format(stu.average)}\n"
          )
        }

        // 写入空行分隔
        writer.write("\n")

        // 写入各科平均分(保留2位小数)
        writer.write(
          s"英语平均分:${"%.2f".format(englishAvg)},数学平均分:${"%.2f".format(mathAvg)},语文平均分:${"%.2f".format(chineseAvg)}\n"
        )

        // 写入各科最高分学生信息
        writer.write(
          s"英语最高分:${englishMax.name}(${englishMax.yingyu}分),数学最高分:${mathMax.name}(${mathMax.shuxue}分),语文最高分:${chineseMax.name}(${chineseMax.yuwen}分)\n"
        )
      }.fold(
        ex => println(s"写入文件失败: ${ex.getMessage}"),
        _ => println("数据处理完成,结果已写入score_result.txt")
      )

    } catch {
      case ex: IOException => println(s"文件操作错误: ${ex.getMessage}")
      case ex: Exception => println(s"程序异常: ${ex.getMessage}")
    }
  }
}