1

我正在使用 Dell Boomi 将数据从一个系统映射到另一个系统。我可以在地图中使用 groovy,但没有经验。我尝试使用其他 Boomi 工具来执行此操作,但被告知我需要在脚本中使用 groovy。我的入站数据是:

132265,棕色

132265,金

132265,灰色

132265,绿色

我想输出:

132265,"棕色,金色,灰色,绿色"

希望这是有道理的!关于 groovy 代码的任何想法来完成这项工作?

4

5 回答 5

3

它可以用groupBy扩展运算符优雅地解决:

@Grapes(
    @Grab(group='org.apache.commons', module='commons-csv', version='1.2')
)

import org.apache.commons.csv.*

def csv = '''
132265,Brown
132265,Gold
132265,Gray
132265,Green
'''

def parsed = CSVParser.parse(csv, CSVFormat.DEFAULT.withHeader('code', 'color')
parsed.records.groupBy({ it.code }).each { k,v -> println "$k,\"${v*.color.join(',')}\"" }

以上打印:

132265,"Brown,Gold,Gray,Green"
于 2016-01-20T02:25:19.177 回答
1

好吧,我不知道您是如何获取数据的,但这是实现目标的一般方法。您可以使用一个库,例如下面的库来解析 csv。

https://github.com/xlson/groovycsv

您的数据示例是:

@Grab('com.xlson.groovycsv:groovycsv:1.1')
import static com.xlson.groovycsv.CsvParser.parseCsv

def csv = '''
132265,Brown
132265,Gold
132265,Gray
132265,Green
'''

def data = parseCsv(csv)

我相信您想将数字与各种颜色值相关联。因此,对于每一行,您可以创建一个数字和与该数字关联的颜色的映射,用“,”分割该行:

map = [:]
for(line in data) {
    number = line.split(',')[0]
    colour = line.split(',')[1]

    if(!map[number])
       map[number] = []

    map[number].add(colour)
}
println map

所以地图应该包含:

[132265:["Brown","Gold","Gray","Green"]]

好吧,如果它不是你想要的,你可以提取一般的想法。

于 2016-01-19T22:56:10.820 回答
0

假设您的数据以逗号分隔的数据字符串形式出现,如下所示:

"132265,棕色132265,金色132265,灰色132265,绿色122222,红色122222,白色"

下面的 Groovy 脚本代码应该可以解决问题。

def csvString = "132265,Brown 132265,Gold 132265,Gray 132265,Green 122222,Red 122222,White"

LinkedHashMap.metaClass.multiPut << { key, value ->
    delegate[key] = delegate[key] ?: []; delegate[key] += value
}

def map = [:]
def csv = csvString.split().collect{ entry -> entry.split(",") }
csv.each{ entry -> map.multiPut(entry[0], entry[1]) }

def result = map.collect{ k, v -> k + ',"' + v.join(",") + '"'}.join("\n")
println result

将打印:

132265,"棕色,金色,灰色,绿色"
122222,"红色,白色"

于 2016-01-19T23:20:26.503 回答
0

您是否出于某种原因必须使用脚本?这可以通过开箱即用的 Boomi 功能轻松实现。

创建一个映射函数,将 ID 字段添加到您选择的字符串(即 222_concat_fields)。然后使用该值设置具有该值的动态流程道具。

process prop 的值将包含连接名称字段的结果。只需将此功能添加到您的地图即可。然后使用最终值填充您的结果。

于 2016-05-08T04:09:43.257 回答
0

好吧,这取决于数据如何来。如果您在问题中发布的数据来自单个文档,那么您可以使用 groovy 脚本在地图中轻松处理。

如果您在问题中发布的数据进入多个文档,即
doc1:132265,Brown
doc2:132265,Gold
doc3:132265,Gray
doc4:132265,Green
在这种情况下它不能被处理到地图中。您将需要将数据处理步骤与自定义脚本一起使用。
对于您要求在 groovy 中创建的代码,取决于您获取数据的输入配置文件。请提供更多信息,即输入配置文件、字段等。

于 2017-02-14T12:58:17.763 回答