scala中文件读写-成绩分析

26 阅读3分钟

(一)任务分析

分成三步来完成按行读入,并拆分。

(1)组装对象数组

(2)对对象数组做数据处理

(3)保存结果到文件。

(二)按行读取文本文件

由于一行表示一条数据,所以,我们可以一次读入一行。以下是读取文件并打印每一行的示例:

package score
/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score01 {
  def main(args: Array[String]): Unit = {
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()

      println(line)
    }
  }
}

(三)组装数据对象

思路:定义case class ,分别去new 对象,并赋值。

1.求取单科成绩

package score
/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score01 {

  case class Stu(name:String, yuwen: Double, shuxue: Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    //
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble)
    }

    /// 读取信息结束
    stuList.foreach(stu => {
      println( s"${stu.name}, 语文考了 ${stu.yuwen}")
    })
  }
}

屏幕截图 2025-12-17 150513.png

(四)分析数据

求取平均分

package score

import java.io.FileWriter

/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score01 {

  case class Stu(name:String, yuwen: Double, shuxue: Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    //
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble)
    }

    // 3. 写入一个新的文件
    val fileWriter = new FileWriter("score_result.txt")

    // 读取信息结束
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.shuxue + stu.yingyu)
      println(s"${stu.name}, 总分: ${total}, 平均分:${total/3}")
    })
  }
}

屏幕截图 2025-12-17 153329.png

写入成功

package score

import java.io.FileWriter

/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score01 {

  case class Stu(name:String, yuwen: Double, shuxue: Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    //
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble)
    }

    // 3. 写入一个新的文件
    val fileWriter = new FileWriter("score_result.txt")

    // 读取信息结束
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.shuxue + stu.yingyu
      fileWriter.write(s"${stu.name}, 总分: ${total}, 平均分:${total/3}")
      println(s"${stu.name}写入成功")
    })
    fileWriter.close()
  }
}

求去去单科最高分

package score

import java.io.FileWriter

/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score02 {

  case class Stu(name:String, yuwen: Double, shuxue: Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    //
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble)
    }

    // 3. 写入一个新的文件
    val fileWriter = new FileWriter("score_result.txt")

    // 读取信息结束
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.shuxue + stu.yingyu
      fileWriter.write(s"${stu.name}, 总分: ${total}, 平均分:${total/3} \n")
      println(s"${stu.name}写入成功")
    })

    //计算单科最高分
    fileWriter.write("最高分 \n")
    fileWriter.write(s"语文最高分:${stuList.map(_.yuwen).max} \n")
    fileWriter.write(s"数学最高分:${stuList.map(_.shuxue).max} \n")
    fileWriter.write(s"英语最高分:${stuList.map(_.yingyu).max} \n")

    fileWriter.close()
  }
}

屏幕截图 2025-12-17 155107.png

求出单科最高分及其得分人的姓名

package score

import java.io.FileWriter

/*
*任务
* 1.读入根目录下的score.txt文件
* 2.计算
*  (1) 每个同学的总分
*  (2) 平均分
*
*  3.把计算的结果写入到score_result.txt文件中
*
*
* */

object score02 {

  case class Stu(name:String, yuwen: Double, shuxue: Double, yingyu:Double)

  def main(args: Array[String]): Unit = {
    //
    val stuList = scala.collection.mutable.ListBuffer[Stu]()
    // 1 按行为单位,一个一个去读入
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    // 跳过第一行,第一行是表头
    lines.next()

    while(lines.hasNext){
      val line = lines.next()
      val list = line.split(",")

      stuList += Stu(list(0),list(1).toDouble,list(2).toDouble,list(3).toDouble)
    }

    // 3. 写入一个新的文件
    val fileWriter = new FileWriter("score_result.txt")

    // 读取信息结束
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.shuxue + stu.yingyu
      fileWriter.write(s"${stu.name}, 总分: ${total}, 平均分:${total/3} \n")
      println(s"${stu.name}写入成功")
    })

    //计算单科最高分
    fileWriter.write("最高分 \n")
    val yuwen_max = stuList.map(_.yuwen).max
    fileWriter.write(s"语文:${yuwen_max} \n")
    fileWriter.write(s"  ${stuList.filter(_.yuwen == yuwen_max).map(_.name).mkString(",")}  \n")

    val shuxue_max = stuList.map(_.shuxue).max
    fileWriter.write(s"数学:${stuList.map(_.shuxue).max} \n")
    fileWriter.write(s"  ${stuList.filter(_.shuxue == shuxue_max).map(_.name).mkString(",")}  \n")

    val yingyu_max = stuList.map(_.yingyu).max
    fileWriter.write(s"英语:${stuList.map(_.yingyu).max} \n")
    fileWriter.write(s"  ${stuList.filter(_.yingyu == yingyu_max).map(_.name).mkString(",")}  \n")


    fileWriter.close()
  }
}

屏幕截图 2025-12-17 160120.png

(五)保存结果

就是把前面计算得到的结果,重新写入到一个全新的文件,这个功能在前面的课程中学习过,直接写出即可。 【保存结果全部为图片所示结果】