我想编写一个Scala脚本来递归处理目录中的所有文件.对于每个文件,我想看看是否有任何情况,其中字符串出现在第X行和第X - 2行.如果出现这种情况,我想停止处理该文件,并将该文件名添加到地图文件名对出现次数的影响.我今天刚刚开始学习Scala,我有文件递归代码工作,需要一些字符串搜索帮助,这是我到目前为止所拥有的:
import java.io.File
import scala.io.Source
val s1= "CmdNum = 506"
val s2 = "Data = [0000,]"
def processFile(f: File) {
val lines = scala.io.Source.fromFile(f).getLines.toArray
for (i = 0 to lines.length - 1) {
// want to do string searches here, see if line contains s1 and line two lines above also contains s1
//println(lines(i))
}
}
def recursiveListFiles(f: File): Array[File] = {
val these = f.listFiles
if (these != null) {
for (i = 0 to these.length - 1) {
if (these(i).isFile) {
processFile(these(i))
}
}
these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}
else {
Array[File]()
}
}
println(recursiveListFiles(new File(args(0))))
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
def processFile(f: File) {
val src = Source.fromFile(f)
val hit = src.getLines().sliding(3).exists{
case List(l0, l1, l2) => l0.contains(s1) && l2.contains(s1)
case _ => false
}
src.close
// do something depending on hit like adding to a Map
}
Run Code Online (Sandbox Code Playgroud)
首先,您不需要转换为数组,您可以保留迭代器以仅读取查找匹配所需的行.
您可以使用sliding3行的滑动窗口来获取派生迭代器,您可以在其中查找字符串i和i+2.
exists测试此滑动迭代器的元素是否满足谓词.case为方便起见,will模式将滑动窗口元素中的3条线与3个val相匹配.我必须使用REPL来找出滑动实际返回的类型.
最后别忘了关闭src.
如果您需要发生次数:
val count = src.getLines().sliding(3).filter{
case List(l0, l1, l2) => l0.contains(s1) && l2.contains(s1)
case _ => false
}.size
Run Code Online (Sandbox Code Playgroud)
您过滤事件,然后获得大小...
编辑了短于3行的文件的匹配错误