2016-01-19 165 views
1

我正在使用Dell Boomi將數據從一個系統映射到另一個系統。我可以在地圖中使用groovy,但沒有經驗。我試圖用其他Boomi工具來做到這一點,但有人告訴我需要在腳本中使用groovy。我的入站數據是:Groovy csv到字符串

132265,布朗

132265,金

132265,灰色

132265,綠色

我想輸出:

「棕色,金色,灰色,綠色」

希望這是有道理的!對Groovy代碼的任何想法,使其工作?

+0

您應該仔細閱讀Groovy:http://groovy-lang.org/documentation.html – cjstehno

+0

輸入數據的格式或數據類型是什麼?它是一個CSV字符串嗎? – pczeus

回答

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"]] 

那麼,如果這不是你想要的,你可以提取一般想法。

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, 「紅,白」

3

它可與groupBy被優雅的解決和spread operator

@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" 
+1

非常好的解決方案。 – pczeus

0

你有使用腳本出於某種原因?這可以通過開箱即用的Boomi功能輕鬆實現。

創建一個映射函數,該函數將ID字段預先設置爲您選擇的字符串(即222_concat_fields)。然後使用該值來設置具有該值的動態過程支持。

process prop的值將包含連接名稱字段的結果。只需將此功能添加到您的地圖應該照顧它。然後使用最終值填充結果。

0

那它取決於數據是怎麼來的。 如果您在問題中發佈的數據來自單個文檔,那麼您可以使用常規腳本輕鬆處理該問題。

如果您曾經參與過的問題的數據來爲多個文件,即
DOC1:132265,布朗
DOC2:132265,金
doc3的:132265,灰色
DOC4:132265,綠色
在那種情況下,它不能被處理成地圖。您將需要使用自定義腳本進行數據處理步驟。
對於您要求在groovy中創建的代碼取決於您獲取數據的輸入配置文件。請提供更多信息,例如輸入配置文件,字段等。