计算文本文件

时间:2017-04-15 09:08:27

标签: scala apache-spark

我有一个巨大的文本文件。我希望在该文本文件中出现“我感觉”一词之后出现一些单词。

以下是文件内容的一个小例子:

i feel awesome
i feel nothing but i also feel awesome
i feel good.

我阅读了文字文件并匹配包含“我觉得”的行。现在我的输出形式为:

res3: Array[String] = Array("awesome", "nothing", "good", ....)

我需要在文本文件中找到这些单词的出现次数。

我目前为此目的使用的代码如下:

 val c1 = scala.io.Source.fromFile("text.txt", "UTF-8").
   getLines.flatMap(regexpr.findAllIn(_).toList).
   foldLeft(Map.empty[String, Int]) {
     (count, word) => count + (word -> (count.getOrElse(word, 0) + 1))
   }

但这让我只计算了该数组中存在的几个单词。 例如,它返回:

c1: scala.collection.immutable.Map[String,Int] = Map(awesome -> 1, nothing -> 4) 

它不会返回列表中存在的单词 all 的计数。另外,如何将Map[String,Int]写入文本文件?

1 个答案:

答案 0 :(得分:1)

以下是文本文件中的行列表:

val lines = scala.io.Source.fromFile("text.txt","UTF-8").getLines

这是一个Java打印作者:

val f = new java.io.PrintWriter(new java.io.File("counts.txt"))

这里是对&#34之后的单词的匹配进行分组;我觉得"写入文本文件的语句:

lines.flatMap {
  "i feel (\\w+)".r.findAllMatchIn(_).map(_.group(1)) // Return only paren matches
}.toTraversable.groupBy(identity).mapValues(_.size).foreach {
  case (word, count) => f.write(s"$count\t$word\n") // Separate by tab
}

然后关闭文件

f.close()

请参阅Scala documentation on regular expressions