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"
}
]
}
]
}
我正在测试 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"
}
]
}
]
}