我有一个包含纯文本的文件,比如:"Umbrella!! This is a very red umbrella. The umbrella should not be this red.
“
我从其中提取了所有关键字(在将所有单词转换为小写之后),并按字母顺序对它们进行排序,这给了我:
keywords = List(red, umbrella)
现在,我想逐行读取文件,查找包含单词"red“和”numbers“的行号,即关键字列表中的单词。
我知道如何逐行阅读文件:
for(line <- Source.fromFile("file.txt").getLines())
但是,如何解析一行中的每个单词并将其与列表元素进行比较呢?请帮帮我!!
编辑:
我想要如下输出:
red 2 3
umbrella 1 2 3
1、2、3是行号。
发布于 2014-12-04 03:47:27
只需在每行上使用keywords.exists(line.contains)
,并在需要时打印索引
Source.fromFile("file.txt").getLines().zipWithIndex.foreach {
case(line, index) =>
if (keywords.exists(line.contains)) println(index)
}
如果您不希望它区分大小写,只需执行line.toLowerCase.contains
Source.fromFile("file.txt").getLines().zipWithIndex.foreach {
case(line, index) =>
if (keywords.exists(line.toLowerCase.contains)) println(index)
}
更新(以反映答案中的更改)
使输出类似于
red 2 3
umbrella 1 2 3
让我们创建一个映射来存储每个单词的行号。
var count = scala.collection.mutable.Map[String, List[Int]]()
keywords.foreach { k => count += k -> List[Int]()}
Source.fromFile("file.txt").getLines().zipWithIndex.foreach {
case (line, index) =>
keywords.foreach { w =>
if (line.toLowerCase.contains(w))
count(w) = count(w) :+ (index + 1)
}
}
count.keys.foreach{ i => println(i + " " + count(i) )}
要获得与您指定的完全相同的输出,请将最后一行替换为
count.keys.foreach{ i =>
print(i + " ")
count(i).foreach{ j => print(j + " ") }
println()
}
发布于 2014-12-04 03:39:59
您可以将每行拆分为单词,然后只需检查列表是否包含所有关键字。使用zipWithIndex获取行号:
Source.fromFile("file.txt").getLines().zipWithIndex.filter { case(line, index) =>
val words = line.toLowerCase.split("\W")
keywords.forall(words.contains)
}
.map(_._2)
编辑:如果你想为每个keywrod创建单独的索引,你需要首先分组到(word,index)元组的列表中,然后flatMap:
Source.fromFile("file.txt").getLines().zipWithIndex
.flatMap { case(line, index) =>
line.toLowerCase.split("\W").map { (_, index+1) } // "+1 because indexes are 0-based
}
.filter { keywords.contains(_._1) }
.groupBy { _._1 }.mapValues(_._2)
这将为您提供一个映射[String,ListInt],其中键是关键字,值是给定关键字出现的行的索引列表。
https://stackoverflow.com/questions/27285670
复制