比较groovy

时间:2016-01-21 16:59:38

标签: sql bash groovy compare

我正在尝试创建比较脚本来比较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文件,我需要的是比较它们的内容。

1 个答案:

答案 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     

现在,您已在extraInFirstextraInSecondcommon

中拥有所有必需的值

它检查每个字段的差异。如果任何领域不同,那么它将不是共同的一部分。我希望你能从它产生任何输出。