scala:文件读写-成绩分析

17 阅读2分钟

任务

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

(1)组装对象数组

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

(3)保存结果到文件。

按行读取文本文件

任务

  1. 读入目录下的score.txt文件 使用getLines来以行为单位读取内容
  2. 计算

(1) 每个同学的总分

(2) 平均分

  1. 把计算结果写入到score_result.txt文件中

基本代码:

package score

/**
 * 任务
 * 1. 读入目录下的score.txt文件
 * 使用getLines来以行为单位读取内容
 * 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 对象,并赋值

基本代码:

package score

/**
 * 任务
 * 1. 读入目录下的score.txt文件
 * 使用getLines来以行为单位读取内容
 * 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 = {
    // 定义一个可变List
    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}")
      })

  }

}

文件信息:

姓名,语文,数学,英语
张三,886695
李四,998475
王五,567890
孙强,987590

分析数据

计算每个人的总分和平均分的基本代码:

object score02 {
  case class Stu(name:String,yuwen:Double,shuxue:Double,yingyu:Double)
  def main(args: Array[String]): Unit = {
    // 定义一个可变List
    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.close()

  }

}

计算单科最高分的基本代码:

// 计算单科最高分
 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.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"数学:${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"英语:${yingyu_max} \n")
 filewriter.write(s"考了英语最高分的人是:${stuList.filter(_.yingyu==yingyu_max).map(_.name).mkString(",")} \n")

结果录入:

张三,总分249.0,平均分:  83.0 
李四,总分258.0,平均分:  86.0 
王五,总分224.0,平均分:  74.66666666666667 
孙强,总分263.0,平均分:  87.66666666666667 
最高分 
语文:99.0 
考了语文最高分的人是:李四 
数学:84.0 
考了数学最高分的人是:李四 
英语:95.0 
考了英语最高分的人是:张三