我正在开发一个项目,需要将 CSV 数据转换为特定的 JSON 格式。 CSV 包含有关人员及其相关产品的信息,我想将这些数据聚合到一个嵌套的 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
}
]
}
这是我尝试使用 DataWeave 的脚本:
%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
如果您正在寻找以下 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
var groupedData = payload groupBy (item) ->
item.Dan ++ '|' ++ item.FirstName ++ '|' ++ item.LastName ++ '|' ++ item.DateofBirth
---
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)
}
})
我会推荐@AnuragSharma 解决方案,因为输出更清晰。但是,如果您确实需要重复的密钥,您可以使用此脚本:
%dw 2.0
output application/json
---
payload
groupBy ($.Dan)
mapObject ((value, key) -> {
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)
})
})
输出:
{
"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
}
]
}