Scala文件读写实战:统计演讲稿单词频次

52 阅读3分钟

一、导入

今天我们来完成一个实用任务:分析一篇演讲稿中单词出现的次数。这份演讲稿的内容保存在一个txt文件中,我们将通过Scala编程实现从文件读取内容、分析数据,并将结果写入新文件的全流程。

二、任务分析

定义

文件读写是数据处理的基础操作,Scala提供了多种方式处理文件I/O,既可以调用Java的IO库,也可以使用Scala原生的工具类。

任务解决步骤

  1. 把文字内容从.txt文件中读到程序中
  2. 写程序分析数据(拆分单词并统计频次)
  3. 对统计结果进行排序
  4. 把结果写入.txt文件

三、核心内容讲解

(一)从文件中读取内容

在Scala中,可以使用scala.io.Source.fromFile方法读取文件内容。

语法格式

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

作用:读入指定文件的内容

关键方法:使用mkString方法可以直接将文件内容转换为字符串

(二)拆分单词并统计个数

思路分析

  1. 使用正则表达式分隔出所有单词
  2. 建立Map结构,key为单词,value为出现次数
  3. 遍历所有单词,更新统计结果

(三)对Map结果排序

Map本身是无序的,需要转换为List或Seq后才能进行排序操作。可以使用sortBy方法按特定规则排序。

(四)结果写入文件

Scala可以使用Java的IO类进行文件写入,FileWriterPrintWriter都是常用的写入工具。

四、代码实现与解析

案例:演讲稿单词频次统计

代码

package words

import java.io.FileWriter

object words01 {
  def main(args: Array[String]) = {
    // val content = "I am studying scala. I like scala.";
    val content = scala.io.Source.fromFile("test.txt").mkString;

    //2. 把字符串拆分为单词
    // val list = content.split(" "); // 使用 空格 去拆分字符串,结果是一个list
    // list.foreach(ele => println(ele))

    val list = content.split("\\W+").map(word=>word.toLowerCase)
    // 使用 正则表达式 W+ 去拆分字符串,结果是一个List
    // \W 表示一个非字符 (!,. ,? 空格)
    // + 一个或多个

    //3. 统计每个单词出现的次数
    //  新建一个Map("I" -> 1, "am" -> 2)
    // val map1 = scala.collection.mutable.Map("I" -> 0)

    val map1 = scala.collection.mutable.Map[String, Int]()

    // 对于list中的每个单词,
    list.foreach(word => {
      // 检查它在Map中是否存在?
      // println(word, map1.contains(word))
      if (map1.contains(word)) {
        map1(word) += 1 // 存在: 把它的值+1
      } else {
        map1(word) = 1 // 不存在: 把它的值设为1
      }
    })
    //4. 对结果排序(降序排列)
    // Map本身是无序的,它没有排序的功能
    // 如果要对它的内容进行排序,那么,我们要把它转换成可以排序的集合:List
    // sortBy排序:根据元组的第二个值
    // reverse: 翻转
    val wordList = map1.toList.sortBy(_._2).reverse

    //5. 把结果输出到一个新的文件中
    val fileWriter = new FileWriter("result.txt")
    wordList.foreach(el => {
      fileWriter.write(s"${el._1} - ${el._2}\n")
    })
    fileWriter.close()

   // wordList.foreach(el => println(el))
  }
}

结果展示

11.png 执行程序后,result.txt文件将包含:

22.png

代码分析

  1. 文件读取:使用Source.fromFile("test.txt").mkString读取整个文件内容到字符串
  2. 单词拆分:使用正则表达式\W+分割非单词字符,并将所有单词转为小写确保统计准确
  3. 频次统计:使用可变Map存储单词频次,遍历单词列表更新统计
  4. 结果排序:将Map转换为List,使用sortBy(_._2).reverse按频次降序排列
  5. 文件写入:使用FileWriter将排序后的结果写入新文件

五、课堂小结

通过本节课的学习,我们掌握了Scala中文件读写的核心技能:

  1. 文件读取:使用scala.io.Source.fromFile().mkString方法
  2. 字符串处理:使用split("\\W+")map方法进行单词分割和规范化
  3. 数据统计:使用可变Map进行频次统计,注意处理单词首次出现的情况
  4. 结果排序:将Map转换为List后使用sortBy方法排序
  5. 文件写入:使用FileWriterPrintWriter将结果写入文件