csv 到 json 中的 2 层分组

问题描述 投票:0回答:1

我在 chatGPT 上花费了超过 8 个小时,其中包括人们创建的有关 DataWeave 的一些 ChatGPT。我正在尝试创建一个包含产品数组的 json 结构。但我得到的脚本似乎用最后一个条目覆盖了产品列表。这就像我需要追加到数组中,但它没有发生。

如何追加到数组,而不是看似覆盖。

csv是这样的

Dan,FirstName,LastName,DateofBirth,ProductName,ProductValue
q,denis,Kriz,01/01/1980,sales cloud,1000
q,denis,kriz,01/01/1980,service cloud,2000
x,lucas,kriz,01/01/2010,marketing cloud,3000

我想要一个像这样的json结构

{
  "Dan": "q",
  "FirstName": "denis",
  "LastName": "kriz",
  "DateOfBirth": "01/01/1980",
  "Products": [
    {
      "productName": "sales cloud", 
      "productValue": 1000
    },
    {
      "productName": "service cloud",
      "productValue": 2000
    }
  ],
  "Dan": "x",
  "FirstName": "lucas",
  "LastName": "kriz",
  "DateOfBirth": "01/01/2010",
  "Products": [
    {
      "productName": "marketing cloud",
      "productValue": 3000
    }
  ]
}

ChatGPT 让我看到了这个脚本;

%dw 2.0
output application/json

var data = payload
var header = data[0]
var rows = data[1 to -1]

var includedFields = ["ProductName", "ProductValue"]

var groupedData = rows groupBy ($.Dan) mapObject ((value, key, index) -> {
    Dan: key,
    FirstName: value[0].FirstName,
    LastName: value[0].LastName,
    DateOfBirth: value[0].DateofBirth,
    Products: value map ((item, index) -> {
        productName: (item.ProductName as String),
        productValue: (item.ProductValue as Number)
    })
})

---
groupedData
dataweave
1个回答
0
投票

如果您正在寻找以下 JSON 作为所需的输出

[
  {
    "Dan": "q",
    "FirstName": "denis",
    "LastName": "kriz",
    "DateOfBirth": "01/01/1980",
    "Products": [
      {
        "productName": "sales cloud",
        "productValue": 1000
      },
      {
        "productName": "service cloud",
        "productValue": 2000
      }
    ]
  },
  {
    "Dan": "x",
    "FirstName": "lucas",
    "LastName": "kriz",
    "DateOfBirth": "01/01/2010",
    "Products": [
      {
        "productName": "marketing cloud",
        "productValue": 3000
      }
    ]
  }
]

你可以使用这个脚本:

%dw 2.0
output application/json
import * from dw::core::Strings
// Directly process the CSV payload
var groupedData = payload groupBy (item) -> 
    item.Dan ++ '|' ++ item.FirstName  ++ '|' ++ item.LastName ++ '|' ++ item.DateofBirth
---
// Transform grouped data into the desired JSON structure
valuesOf(groupedData) map ((group, index) -> {
    Dan: group[0].Dan,
    FirstName: group[0].FirstName,
    LastName: group[0].LastName,
    DateOfBirth: group[0].DateofBirth,
    Products: group map (product) -> {
        productName: product.ProductName,
        productValue: (product.ProductValue as Number)
    }
})

© www.soinside.com 2019 - 2024. All rights reserved.