36 文件读写-成绩分析

31 阅读1分钟

一. 任务分析

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

(1)组装对象数组

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

(3)保存结果到文件

image.png

image.png

二. 从文件中读出内容

在scala中,涉及到文件读写的方法有很多,可以使用java.io下的工具包,也可以使用scala.io下的功能。

下面介绍source.fromFile这个方法。

格式:

scala.io.Source.formFile(文件名)

作用: 读入一个文件

如果想要直接得到文本文件,使用mkString方法即可。

def main(args: Array[String]): Unit = {
  // 1. 读入文件
  val content = scala.io.Source.fromFile("score.txt").mkString
  println(content)
}

结果如图:

image.png

三. 按行读取文本文件

由于一行表示一条数据,所以,我们可以一次读入一行。

def main(args: Array[String]): Unit = {

    // 1. 读入文件 迭代器
    val lines = scala.io.Source.fromFile("score.txt").getLines()

    println(lines.next())
} 

结果如图:

image.png

四. 拆分字符串

字符串的split方法。

def main(args: Array[String]): Unit = {
  // println("小关:100,80,90".split(","))

  // 1. 读文件 迭代器
  val lines = scala.io.Source.fromFile("score.txt").getLines()
  lines.next() // 跳过第一行

  while(lines.hasNext){
    val line = lines.next() 
    // 字符串拆分
    val l1 = line.split(",")
    val name = l1(0)
    val yuwen = l1(1)

    println(s"$name, $yuwen")
  }

}

结果如图:

image.png

五. 分析数据

任务1:计算每个人的总分和平均分

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

def main(args: Array[String]): Unit = {
  // 0. 创建一个可变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 l1 = line.split(",")
    // 添加入队记录
    stuList += Stu(l1(0), l1(1).toDouble, l1(2).toDouble, l1(3).toDouble)
  }

  println("录入数据结束")

  stuList.foreach{stu =>
    val total: Double = stu.yuwen + stu.shuxue + stu.yingyu
    val avg: Double = total / 3
    println(s"${stu.name}, 总分: ${total} 平均分: ${avg}")
  }
}

结果如图:

image.png

六. 保存结果

把前面计算得到的结果,重新写入到一个全新的文件。

import java.io.FileWriter

object score01 {

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

  def main(args: Array[String]): Unit = {
    // 0. 创建一个可变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 l1 = line.split(",")
      // 添加入队记录
      stuList += Stu(l1(0), l1(1).toDouble, l1(2).toDouble, l1(3).toDouble)
    }

    println("录入数据结束")

    // 2. 计算
    println("计算结果,开始写入")
    // 3. 保存结果
    val fileWriter = new FileWriter("score_result.txt")

    fileWriter.write("高三109班成绩单 \n");
    stuList.foreach(stu => {
      val total = stu.yuwen + stu.yingyu + stu.shuxue
      val avg = total / 3
      fileWriter.write(s"${stu.name}, 总分: ${total} 平均分: ${avg} \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");

    // println(stuList.map(_.yuwen).max )

    fileWriter.close()
  }

}

自动生成:

image.png

结果如图:

image.png