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

talend: Merge multiple (complex) flat files into single JSON file

我正在测试 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 将 files/rows 合并在一起,然后 tAggregate 按 id 分组。这不太有效,因为它导致语言和颜色属性被单独格式化为逗号分隔列表:

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

这不是我们所要求的。

是否可以在talend中实现我们所需要的?如果是,怎么做?

这是我整理的解决方案,使用 java json 库,因为 json 组件无法处理如此复杂的结构。

tAggregateRow 设置:

首先,载入 json-java.jar using a tLibraryLoad. Then join data using a tMap (on the id column, returning all matches), then aggregate it using the id, and output a list of objects for language and colour. Then in tJavaFlex, loop over the rows to construct the final json (here's the 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"
                }
            ]
        }
    ]
}