在 Scala 中按行中的内容比较两个文件
Comparing two files by the content in their lines in 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.cnf
与 example_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
不在生成的文件中,因为数字 1
、[=] 中的 none 25=] 和 6
在 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
。我如何比较这两个文件?
从概念上讲应该如下所示:
val file1: List[String] = // read file and getLines
val file2: List[String] = // read file and getLines
val result = file1.filter { line =>
file2.contains(line)
}
好吧,如果您想从 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
.
应该很容易计算出来
我有两个 .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.cnf
与 example_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
不在生成的文件中,因为数字 1
、[=] 中的 none 25=] 和 6
在 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
。我如何比较这两个文件?
从概念上讲应该如下所示:
val file1: List[String] = // read file and getLines
val file2: List[String] = // read file and getLines
val result = file1.filter { line =>
file2.contains(line)
}
好吧,如果您想从 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
.