talend:将多个(复杂)平面文件合并为单个JSON文件

时间:2018-01-09 07:11:40

标签: java json talend

我正在测试talend在项目中的潜在用途 - 基本任务很容易完成,但是我正在努力应对以下情况:

我们有多个平面文件,所有这些文件结合起来描述各种项目。对于我的测试,我只想将其中两个文件(现在)合并为JSON格式。这里的问题是其中一个文件每个项目包含1行或更多行;

例如:

文件1:id,类别

1, A   
2, A  
3, B

文件2:id,语言,颜色

1, en_GB, Red  
1, de_DE, Rot  
2, en_GB, Blue  
3, en_GB, Green  
3, de_DE, Grün  
3, es_ES, Verde 

结果应如下所示:

{  
  items[{  
    "id": 1,  
    "category": "A",  
    "colours": [{  
      "language": "en_GB",  
      "colour": "Red"  
     }, {  
      "language": "de_DE",  
      "colour": "Rot"  
    }],  
  },  
...  
}

到目前为止我尝试的是:

tMap将文件/行合并在一起,然后通过id进行分组。这不太有用,因为它会将语言和颜色属性单独格式化为逗号分隔列表:

"language": "en_GB, de_DE",  
"colour": "Red, Rot"

这不是我们要求的。

是否有可能实现我们在talend中所需要的东西?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

这是我使用java json库放在一起的解决方案,因为json组件不处理这种复杂的结构。

enter image description here

tAggregateRow设置:

enter image description here

首先,使用tLibraryLoad加载json-java.jar。然后使用tMap连接数据(在id列上,返回所有匹配项),然后使用id聚合它,并输出语言和颜色的对象列表。然后在tJavaFlex中,遍历行以构造最终的json(这里是java code)。

根据您的示例提供以下格式化输出:

{
    items: [{
            "id": 1,
            "category": "A",
            "colours": [{
                    "colour": "Red",
                    "language": "en_GB"
                }, {
                    "colour": "Rot",
                    "language": "de_DE"
                }
            ]
        }, {
            "id": 2,
            "category": "A",
            "colours": [{
                    "colour": "Blue",
                    "language": "en_GB"
                }
            ]
        }, {
            "id": 3,
            "category": "B",
            "colours": [{
                    "colour": "Green",
                    "language": "en_GB"
                }, {
                    "colour": "Grün",
                    "language": "de_DE"
                }, {
                    "colour": "Verde",
                    "language": "es_ES"
                }
            ]
        }
    ]
}