string - 斯卡拉 : cleanest way to recursively parse files checking for multiple strings

标签 string file scala

我想编写一个 Scala 脚本来递归处理目录中的所有文件。对于每个文件,我想看看是否有任何情况在第 X 行和第 X - 2 行出现字符串。如果发生这种情况,我想停止处理该文件,并将该文件名添加到 map 文件名的出现次数。我今天才开始学习 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))))

最佳答案

你可以这样做:

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
}

首先您不需要转换为数组,您可以保留迭代器以仅读取找到匹配项所需的行。

您可以使用 sliding 使用 3 行的滑动窗口获取派生迭代器,您可以在 ii+2< 行中查找字符串

exists 测试此滑动迭代器的元素是否满足谓词。为了方便起见,case 会将滑动窗口元素中的 3 行模式匹配到 3 个值中。 我必须使用 REPL 来找出滑动真正返回的类型

最后别忘了关闭src。

如果需要出现次数:

  val count = src.getLines().sliding(3).filter{ 
    case List(l0, l1, l2) => l0.contains(s1) && l2.contains(s1)
    case _ => false
  }.size

您过滤出现的次数,然后获取大小...

针对短于 3 行的文件的匹配错误进行了编辑

关于string - 斯卡拉 : cleanest way to recursively parse files checking for multiple strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4629984/

相关文章:

c++ - 使用 vector 还是数组?

javascript - 如何从字符串中删除列表短语?

java - 通过相对路径将文件读入编译好的jar中

从 X 长度的文件读取二进制数据时 C++ 程序崩溃

c++ - 在字符串 C++ 中查找标点符号

string - Knuth–Morris–Pratt 算法 : border array

c++ - 用 ofstream C++ 覆盖一行

scala - 在 emr 5.29.0 上运行 Scala 2.12

scala - 如何使用 IntelliJ IDEA 生成 Scala setter 和 getter

Scala 流计算抛出 StackOverflowError