Groovy CSV в строку

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

132265, Коричневый

132265, золото

132265, серый цвет

132265, Зеленый

Я хотел бы вывести:

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

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

5 ответов

Это может быть элегантно решено с 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"

Ну, я не знаю, как вы получаете ваши данные, но вот общий способ достижения вашей цели. Вы можете использовать библиотеку, такую ​​как приведенная ниже, для разбора 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"]]

Ну, если это не то, что вы хотите, вы можете извлечь общую идею.

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

Если данные, которые вы разместили в вопросе, попадают в несколько документов, т.е.
док1: 132265, коричневый
doc2: 132265, золото
doc3: 132265, серый
doc4: 132265, зеленый
В этом случае он не может быть обработан в карте. Вам нужно будет использовать Шаг обработки данных с пользовательскими сценариями.
Для кода, который вы просите создать в Groovy, зависит от профиля ввода, в котором вы получаете данные. Пожалуйста, предоставьте больше информации: профиль ввода, поля и т. Д.

Вы должны использовать сценарии по какой-то причине? Это может быть легко достигнуто с готовой функциональностью Boomi.

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

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

Предполагая, что ваши данные поступают в виде строки данных через запятую, как это:

"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, "Красный, белый"

Другие вопросы по тегам