一、导入
今天我们来完成一个实用任务:分析一篇演讲稿中单词出现的次数。这份演讲稿的内容保存在一个txt文件中,我们将通过Scala编程实现从文件读取内容、分析数据,并将结果写入新文件的全流程。
二、任务分析
定义
文件读写是数据处理的基础操作,Scala提供了多种方式处理文件I/O,既可以调用Java的IO库,也可以使用Scala原生的工具类。
任务解决步骤
- 把文字内容从.txt文件中读到程序中
- 写程序分析数据(拆分单词并统计频次)
- 对统计结果进行排序
- 把结果写入.txt文件
三、核心内容讲解
(一)从文件中读取内容
在Scala中,可以使用scala.io.Source.fromFile方法读取文件内容。
语法格式:
scala.io.Source.fromFile(文件名)
作用:读入指定文件的内容
关键方法:使用mkString方法可以直接将文件内容转换为字符串
(二)拆分单词并统计个数
思路分析:
- 使用正则表达式分隔出所有单词
- 建立Map结构,key为单词,value为出现次数
- 遍历所有单词,更新统计结果
(三)对Map结果排序
Map本身是无序的,需要转换为List或Seq后才能进行排序操作。可以使用sortBy方法按特定规则排序。
(四)结果写入文件
Scala可以使用Java的IO类进行文件写入,FileWriter和PrintWriter都是常用的写入工具。
四、代码实现与解析
案例:演讲稿单词频次统计
代码
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))
}
}
结果展示
执行程序后,result.txt文件将包含:
代码分析
- 文件读取:使用
Source.fromFile("test.txt").mkString读取整个文件内容到字符串 - 单词拆分:使用正则表达式
\W+分割非单词字符,并将所有单词转为小写确保统计准确 - 频次统计:使用可变Map存储单词频次,遍历单词列表更新统计
- 结果排序:将Map转换为List,使用
sortBy(_._2).reverse按频次降序排列 - 文件写入:使用
FileWriter将排序后的结果写入新文件
五、课堂小结
通过本节课的学习,我们掌握了Scala中文件读写的核心技能:
- 文件读取:使用
scala.io.Source.fromFile().mkString方法 - 字符串处理:使用
split("\\W+")和map方法进行单词分割和规范化 - 数据统计:使用可变Map进行频次统计,注意处理单词首次出现的情况
- 结果排序:将Map转换为List后使用
sortBy方法排序 - 文件写入:使用
FileWriter或PrintWriter将结果写入文件