Groovy 从其他字段的resultset和string concat中获取不同的用户

Groovy 从其他字段的resultset和string concat中获取不同的用户,groovy,Groovy,我有一个查询的Sql结果集。它有以下字段:用户名、部门、…职责。 deptmt和responblty有不同值的重复用户名。我想获得一个地图/唯一用户名列表,以及结果集中每个用户的部门和职责列表 所以如果 resultset = (Sam, dept1,.. resp1), (Tom, dept1,..resp3), (Sam,dept2,..resp2),

我有一个查询的Sql结果集。它有以下字段:用户名、部门、…职责。 deptmt和responblty有不同值的重复用户名。我想获得一个地图/唯一用户名列表,以及结果集中每个用户的部门和职责列表

所以如果

       resultset =     (Sam, dept1,.. resp1),
                       (Tom, dept1,..resp3),
                       (Sam,dept2,..resp2),
                       (Tom,dept3,..resp3)...etc
输出应该是

 finalList = [["Sam", "dept1,dept2", "resp1,resp2"],["Tom", "dept1,dept3", "resp3"]]
需要注意的事项:
1)可能有n列是可变的(从属性文件读取的列列表),因此代码是可调整的暂时不需要,现在是固定列表
2) 所有值都用双引号括起来,并用逗号分隔。
3) For tom responsibility只包含resp3,因为它重复了…即列表中的唯一值。

如何转换结果集?

谢谢

这会让你离得很近。请注意,最终输出中没有引号(Groovy不会打印字符串的引号)。查看代码,您可以看到“output”是一个列表集合,每个列表包含3项:名称、部门字符串的逗号sep列表,然后是责任字符串的逗号sep列表

顺便说一句,如果您想创建一个逗号sep列表作为最终输出,您可能希望在内部字符串中使用逗号以外的内容

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]


def tmpmap = [:]
data.each { inputrow ->
    def name = inputrow[0]
    def curlist = tmpmap[name]
    if ( curlist == null ) { // first time seeing this name
        curlist = [name,inputrow[1],inputrow[2]]
        tmpmap.put( name, curlist );
    } else { // seen this name before
        curlist[1] += ',' + inputrow[1]
        curlist[2] += ',' + inputrow[2]
    }
}
output = tmpmap.values()
println output    

这会让你离得很近。请注意,最终输出中没有引号(Groovy不会打印字符串的引号)。查看代码,您可以看到“output”是一个列表集合,每个列表包含3项:名称、部门字符串的逗号sep列表,然后是责任字符串的逗号sep列表

顺便说一句,如果您想创建一个逗号sep列表作为最终输出,您可能希望在内部字符串中使用逗号以外的内容

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]


def tmpmap = [:]
data.each { inputrow ->
    def name = inputrow[0]
    def curlist = tmpmap[name]
    if ( curlist == null ) { // first time seeing this name
        curlist = [name,inputrow[1],inputrow[2]]
        tmpmap.put( name, curlist );
    } else { // seen this name before
        curlist[1] += ',' + inputrow[1]
        curlist[2] += ',' + inputrow[2]
    }
}
output = tmpmap.values()
println output    

比尔的解决方案的一个较短的替代方案是:

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]

def output = data.groupBy { it[0] }.collect { name, vals -> 
  $/"$name", "${vals*.getAt( 1 ).join(',')}", "${vals*.getAt( 2 ).join(',')}"/$
}

output.each {
  println it
}
其中打印:

"Sam", "dept1,dept2", "resp1,resp2"
"Tom", "dept1,dept2", "resp3,resp4"

比尔的解决方案的一个较短的替代方案是:

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]

def output = data.groupBy { it[0] }.collect { name, vals -> 
  $/"$name", "${vals*.getAt( 1 ).join(',')}", "${vals*.getAt( 2 ).join(',')}"/$
}

output.each {
  println it
}
其中打印:

"Sam", "dept1,dept2", "resp1,resp2"
"Tom", "dept1,dept2", "resp3,resp4"

说清楚一点,你会抛弃部门和那个人的责任之间的关系,对吗?i、 e.Sam是dept1的resp1,dept2的resp2,但是一旦你转换了他,你就不再知道他为每个部门做了什么。是的,我不需要保持这种关系,我最终想将输出写入csv,由应用程序读取,它需要这种格式的数据。仅此而已。我想说清楚,你会抛弃部门和那个人的责任之间的关系,对吗?i、 e.Sam是dept1的resp1,dept2的resp2,但是一旦你转换了他,你就不再知道他为每个部门做了什么。是的,我不需要保持这种关系,我最终想将输出写入csv,由应用程序读取,它需要这种格式的数据。仅此而已..感谢您的解决方案,但在形成输出时在代码中获得双引号非常重要,因为这将清除列列表中的值分隔符和列字段之间的分隔符。因此,上次分组时,它不应连接(,)…也许我可以再次处理此分隔符,但是这个修改会起作用吗?…['\'''+''''''+'\'''''''+''''''''+'\'''''''.+vals*.getAt(1)?.join(',')+''''.'''.'''.''''.''非常感谢,这确实是有史以来最简洁的答案…:)。请问我怎样才能学好闭包?你推荐哪本书?谢谢你的“群比”方法。。。我不知道这一点。@pri_dev这与其说是一个
闭包
的事情,还不如说是知道一些让你在Groovy中操作集合的方法。有一个很好的广告,一直在添加新的广告(比如Groovy 1.8.6中添加的广告),但是,在形成输出时在代码中获取双引号是很重要的,因为这将清除列列表中的值分隔符和列字段之间的分隔。因此,上次分组时,它不应连接(,)…也许我可以再次处理此分隔符,但此修改是否有效?…['\''''+'name+'\'“,”\“'+vals*.getAt(1)?。join(“,”)+“\”,“\””+vals*.getAt(2)?。join(“,”)+“\”]非常感谢,这是有史以来最简洁的答案…:)。请问我怎样才能学好闭包?你推荐哪本书?谢谢你的“群比”方法。。。我不知道这一点。@pri_dev这与其说是一个
闭包
的事情,还不如说是知道一些让你在Groovy中操作集合的方法。有一个很好的广告,一直在添加新的广告(比如Groovy 1.8.6中添加的广告)。。唯一的问题是,将无法分隔列和每列中的多个条目,因为如果没有双引号,所有分隔符都应该是逗号(,),并且列表中没有嵌套的值来分隔。感谢您的解决方案。。唯一的问题是,将不可能分隔列和每列中的多个条目,因为如果没有双引号,所有分隔符都应该是逗号(,),并且列表中没有嵌套的值来分隔它。