【问题标题】:Groovy csv to stringGroovy csv 到字符串
【发布时间】:2016-04-25 14:12:09
【问题描述】:

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

132265,棕色

132265,金

132265,灰色

132265,绿色

我想输出:

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

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

【问题讨论】:

标签: csv groovy mapping boomi


【解决方案1】:

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

【讨论】:

  • 非常好的解决方案。
【解决方案2】:

好吧,我不知道您是如何获取数据的,但这是实现目标的一般方法。您可以使用如下库来解析 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"]]

好吧,如果不是你想要的,你可以提取大致的想法。

【讨论】:

    【解决方案3】:

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

    "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,"红、白"

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-09
          • 1970-01-01
          • 2021-03-28
          • 2015-01-03
          • 1970-01-01
          • 2015-03-13
          • 2021-06-29
          • 2023-04-02
          相关资源
          最近更新 更多