代码之家  ›  专栏  ›  技术社区  ›  Eric

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

  •  1
  • Eric  · 技术社区  · 6 年前

    我正在测试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分组。这不太管用,因为它会导致语言和颜色属性被单独格式化为逗号分隔的列表:

    ie。

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

    这不是我们所需要的。

    是否有可能实现我们在泰伦德所需要的?如果是,如何?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ibrahim Mezouar    6 年前

    这是我使用java json库提出的一个解决方案,因为json组件不会处理如此复杂的结构。

    enter image description here

    tAggregateRow设置:

    enter image description here

    首先,加载 json-java.jar 使用tLibraryLoad。然后使用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"
                    }
                ]
            }
        ]
    }