在 Scala 中按行中的内容比较两个文件



我有两个.dimacs格式的文件,例如:

 c example_01.cnf
 p cnf 6 9
  1 0
 -2 1 0
 -1 2 0
 -5 1 0
 -6 1 0
 -3 2 0
 -4 2 0
 -3 -4 0
  3 4 -2 0

c example_02.cnf
p cnf 9 6
-7 2 0
7 -2 0
-8 3 0
8 -3 0
-9 4 0
9 -4 0

我想将文件example_01.cnfexample_02.cnf进行比较,以便从文件example_01.cnf中提取具有相似值(在任何行中)的那些行 example_02.cnf ,并将结果保存在一个新文件中,例如 example_result.cnf .

在这种情况下,example_result.cnf将如下所示:

c example_result.cnf
p cnf 4 6
-2 1 0
-1 2 0 
-3 2 0
-4 2 0
-3 -4 0
3 4 -2 0 

例如,1 0-5 1 0-6 1 0行不在生成的文件中,因为156都没有在example_02.cnf中。

我当前的代码是:

import scala.io.Source
    object Example_01 {
      val source = Source.fromFile("example_01.cnf")
      val source2 = Source.fromFile("example_02.cnf")
      val destination = new PrintWriter(new File("example_result.cnf"))
      def main(args: Array[String]): Unit = {
        var nrVariables: Int = 0
        var nrLines: Int = 0
        destination.write("c example_result.cnf n")
        destination.write("p cnf " + nrVariables + " " + nrLines + "n") //not finished!
        /* How I can compare the all the numbers from the second file 'source2' like in the 'if' statement below? */            
         for(line <- source.getLines()) ; if line.contains("2") & line.contains("0") ) {
            destination.write(line)
            destination.write("n")
            nrLines += 1        
        }
        source.close()
        destination.close()
      }

在此代码中,我尚未使用第二个文件example_02.cnf。如何比较这两个文件?

好吧,如果您想从 source1 中保存行,该行包含任何 source2 行中的数字,这应该可以工作:

object Example {
  val source = Source.fromFile("example_01.cnf").getLines()
  val source2 = Source.fromFile("example_02.cnf").getLines()
  val nrsSource2 = source2.mkString(" ").split(" ").distinct.diff(Array("0"))
  val linesToSave = source.drop(2).filter {
    l =>
      l.split(" ").exists(nr => nrsSource2.contains(nr))
  }
  val nrLines = linesToSave.length
  val nrVariables = ??? //don't know what this is
  //write linesToSave to a file
}

不确定 nrVariables 代表什么,但应该很容易从linesToSave计算。

从概念上讲,它应该是像下面这样:

val file1: List[String] = // read file and getLines
val file2: List[String] = // read file and getLines
val result = file1.filter { line => 
  file2.contains(line)
}

相关内容

  • 没有找到相关文章

最新更新