2016-01-19 6 views
1

Я использую Dell Boomi для сопоставления данных из одной системы в другую. Я могу использовать groovy на картах, но у меня нет опыта. Я попытался сделать это с помощью других инструментов Boomi, но мне сказали, что мне нужно использовать groovy в скрипте. Мой въездной данные:Groovy csv to string

132265, Brown

132265, золото

132265, Серый

132265, Зеленый

Я хотел бы вывод:

132265, «Браун, золото, серый, зеленый»

Надеюсь, это имеет смысл! Какие-нибудь идеи о коде, чтобы сделать эту работу?

+0

Возможно, вам стоит прочитать на Groovy: http://groovy-lang.org/documentation.html – cjstehno

+0

Какой формат или тип данных являются вашими входящими данными? Это CSV String? – 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, Brown 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.

Создайте функцию карты, которая добавляет поле идентификатора в строку по вашему выбору (то есть 222_concat_fields). Затем используйте это значение, чтобы установить динамическую поддержку процесса с этим значением.

Значение параметра prop будет содержать результат объединения полей имени. Просто добавив эту функцию на свою карту, следует позаботиться об этом. Затем используйте конечное значение, чтобы заполнить ваш результат.

0

Ну, это зависит от данных, как это происходит. Если данные, которые вы опубликовали в вопросе, поступают в один документ, вы можете легко справиться с этим на карте с отличными сценариями.

Если данные, которые вы выложили в вопросе вступления в несколько документов, то есть
doc1: 132265, Brown
doc2: 132265, золото
doc3: 132265, Серый
doc4: 132265, Зеленый
В этом случае он не может быть обработан на карте. Вам нужно будет использовать процесс обработки данных с пользовательскими сценариями.
Код, который вы хотите создать в groovy, зависит от профиля ввода, в котором вы получаете данные. Пожалуйста, предоставьте дополнительную информацию, например, профиль ввода, поля и т. Д.