Scala | 文件读写-全文单词统计

25 阅读4分钟

一、任务分析

    1. 把文字内容从.txt文件中读到内存中。
    1. 写程序分析数据。
    1. 把结果写入.txt文件。

二、从文件中读出内容

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

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

格式:scala.io.Source.formFile(文件名)
作用:读入一个文件

三、代码(一 & 二):

1.读入test.txt的内容

Source.forFile().mkString

2.对字符串进行拆分 把句子变成一个一个单词

split

object word01 {
  def main(args: Array[String]): Unit = {
    // 1.读入test.txt的内容  大大的长长的字符串
    //  Source.forFile().mkString
    // 2.对字符串进行拆分 把句子变成一个一个单词
    //  split

    // 1.读入test.txt的内容  大大的长长的字符串
    val content = scala.io.Source.fromFile("./test.txt").mkString
    println(content)

    // 2.对字符串进行拆分
    
    // map把每个单词都变为小写
    val rst = content.split("\\W+").map(ele => ele.toLowerCase)

    //["We", "are", "all", "in", "the", "gutter", "but", "some", "ot", "us", "are", "iooking", "at", "the","stars"]

    rst.foreach(println)

    //  \W+ 正则表示式, W表示一个非字符(空格,符号 ,。 ? ! : ;)
  }

}

注意:需要创一个文件,这个文件要和 src 为同级关系

屏幕截图 2025-12-15 095241.png

屏幕截图 2025-12-15 084225.png

运行结果:

屏幕截图 2025-12-15 095345.png

四、写拆分单词统计个数

  • 1. 分隔出一个一个的单词。

  • 2. 建立一个Map,key是单词,value是次数。

  • 3. 遍历所有的单词,对每个单词来说:

判断单词是否存在,如果存在把对应的key+1;

否则就设置对应的key,且value为1

// 3.空的容器保存键值对数据: 键:单词、值:次数
val map = scala.collection.mutable.Map[String, Int]()
rst.foreach(word => {
  // 如果word在map中存在,就把值+1
  if(map.contains(word)) {
    map(word) += 1
  }
  // 如果word在map中不存在,就把值设为1
  else {
    // map += word -> 1
    map (word) = 1
  }

  // println(word, map.contains(word))
})

// 4.打印统计结果
map.foreach(println)

运行结果:

屏幕截图 2025-12-15 095438.png

五、Map结果排序

Map本身是键值对,它是无序的。可以先转成List或者Seq,然后再排序。

//  5.排序

// 按照单词出现的频率,从高到低排序
// map是无序的,不能做排序
// list是可以排序的
map.toList.sortBy(_._2).reverse.foreach(ele => {
  println(ele._1, ele._2)
})

运行结果:

屏幕截图 2025-12-15 100418.png

六、把结果写入到文件中

// 6、把结果写入到文件中
val writer = new FileWriter("result.txt")
wordLists.foreach(ele => {
  writer.write(s"${ele._1}:${ele._2}\n")
})
writer.close()

运行结果:

屏幕截图 2025-12-15 103212.png

完整代码:

object word01 {
  def main(args: Array[String]): Unit = {
    // 1.读入test.txt的内容  大大的长长的字符串
    //  Source.forFile().mkString
    // 2.对字符串进行拆分 把句子变成一个一个单词
    //  split

    // 1.读入test.txt的内容  大大的长长的字符串
    val content = scala.io.Source.fromFile("./test.txt").mkString
    println(content)

    // 2.对字符串进行拆分

    // map把每个单词都变为小写
    val rst = content.split("\W+").map(ele => ele.toLowerCase)

    // ["We", "are", "all", "in", "the", "gutter", "but", "some", "ot", "us", "are", "iooking", "at", "the","stars"]
    rst.foreach(println)
    //  \W+ 正则表示式, W表示一个非字符(空格,符号 ,。 ? ! : ;)

    // 3.空的容器保存键值对数据: 键:单词、值:次数
    val map = scala.collection.mutable.Map[String, Int]()
    rst.foreach(word => {
      // 如果word在map中存在,就把值+1
      if(map.contains(word)) {
        map(word) += 1
      }
      // 如果word在map中不存在,就把值设为1
      else {
        // map += word -> 1
        map (word) = 1
      }

      // println(word, map.contains(word))
    })

    // 4. 打印统计结果
    // map.foreach(println)

    // 5.排序

    // 按照单词出现的频率,从高到低排序
    // map是无序的,不能做排序
    // list是可以排序的
    val wordLists = map.toList.sortBy(_._2).reverse

    // 6、把结果写入到文件中
    val writer = new FileWriter("result.txt")
    wordLists.foreach(ele => {
      writer.write(s"${ele._1}:${ele._2}\n")
    })
    writer.close()

  }
}