Scala:以递归方式解析检查多个字符串的文件的最简洁方法

fre*_*set 2 string scala file

我想编写一个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)

huy*_*hjl 7

你可以这样做:

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行的滑动窗口来获取派生迭代器,您可以在其中查找字符串ii+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行的文件的匹配错误