我正在尝试创建比较脚本来比较2个SQL表。 这两个表中的每一个都有大约4.000行。
我使用Groovy导入表并将它们存储为CSV文件。 对于这两个CSV,第一列是我需要用于比较的ID。
对于每个id号,可能有很多行。 对于其他CSV中的相同ID,一个CSV中ID的行数可能不同。
例如:
CSV1 - CSV2
--------- - ----------
ID, Value - ID , value
1 , A - 1 , A
1 , B - 2 , A
2 , A - 2 , B
3 , B - 3 , C
所以在上面的例子中,我希望输出像
ID,Value, FoundIn
1, A , both
1, B , 1
2, A , both
2, B , 2
3, B , 1
3, B , 2
到目前为止,我还没有遇到过在Groovy中进行比较的合适方式。
我试过在groovy中嵌套bash并使用diff命令,如:
"println "diff -sw /home/testFolder/file1.txt /home/testFolder/file2.txt".execute().text
但是diff会逐行比较,在这种情况下不起作用。
有更好的方法吗?
我对编程的了解非常狭窄,我很乐意使用一些帮助。 我希望我已经给你足够的信息来理解这个问题,但如果没有,我很乐意提供更多。
提前致谢
编辑:
只是为了让它更清晰
例如:
CSV1 - CSV2
--------- - ----------
ID, value - ID , value
1 , A - 1 , A
1 , B - 2 , A
2 , A - 2 , B
3 , B - 3 , C
以上示例仅显示两个文件的假定内容。这不是实际的结构。所以,我有两个不同的文件。我只使用连字符( - )来表明它们是不同的文件。文件中不存在连字符。 我已经有两个csv文件,它们的内容是从sql表导入的。 每个csv文件的内容如下所示:
[id:1, value1:A, value2:B, value3:C]
[id:1, value1:A, value2:G, value3:K]
[id:2, value1:A, value2:G, value3:K]
其中id,value1,value2,value3
它曾经是sql表的列名。
所以我有这些csv文件,我需要的是比较它们的内容。
答案 0 :(得分:0)
def csvParser = {String filePath->
File csvFile = new File("/home/sachin/Projects/scripts/groovyScript/csv.csv")
def keys = []
def data = []
csvFile.eachLine{line, i ->
if(i==1) {
keys = line.split(',')
return
}
def map = [:]
line.split(',').eachWithIndex{val, j->
map[keys[j]] = val
}
data.push(map)
}
data
}
def data = ["path1","path2"].collect {csvParser(it)}
def extraInFirst = data[0] - data[1]
def extraInSecond = data[1] - data[0]
def common = (data[0] - (data[0] - data[1]))
预期输入格式:
ID, Value
1 , A
1 , B
2 , A
3 , B
现在,您已在extraInFirst
,extraInSecond
和common
它检查每个字段的差异。如果任何领域不同,那么它将不是共同的一部分。我希望你能从它产生任何输出。