преобразование CSV в JSON, где некоторые теги могут не входить - PullRequest
0 голосов
/ 21 мая 2019

У меня есть ввод CSV, как показано ниже: Обратите внимание, что тег Edible не подходит для второго набора значений.Также обратите внимание, что данные для одного объекта поступают в столбцы, а также в три строки:

Key|Value|ConcatenatedString
Name|Fruit|"apple,orange,pineapple"
Status|Good|"apple,orange,pineapple"
Edible|Yes|"apple,orange,pineapple"
Name|Furniture|"chair,table,bed"
Status|Good|"chair,table,bed"

Мне нужно это в следующем формате json:

{
Name:"Fruit",
Status:"Good",
Edible:"Yes"
ConcatenatedString:"apple,orange,pineapple"
},
{
Name:"Furniture",
Status:"Good",
Edible:null
ConcatenatedString:"chair,table,bed"
}

Я использовал нижекод, когда все теги приходили для всех объектов.Но теперь, когда некоторые теги могут вообще не появиться, я не уверен, как с этим справиться, поскольку я использовал позиционный подход:

%dw 2.0

input payload application/csv separator='|'
output application/json
---
payload map
{
Name:payload[(($$)*4)+0].Value,
Status:payload[(($$)*4)+1].Value,
Edible:payload[(($$)*4)+2].Value,
ConcatenatedString:payload[(($$)*4)+0]."ConcatenatedString"
} 
filter ($.Name!= null)

Заранее спасибо,

Anoop

1 Ответ

0 голосов
/ 21 мая 2019

вот мой ответ.

%dw 2.0
input payload application/csv  separator="|"
output application/json  
---
payload 
    groupBy ((item, index) -> item.ConcatenatedString) 
    pluck ((value, key, index) -> {
        Name: (value filter ((item, index) -> item.Key == "Name")).Value[0],
        Status: (value filter ((item, index) -> item.Key == "Status")).Value[0],
        Edible: (value filter ((item, index) -> item.Key == "Edible")).Value[0],
        ConcatenatedString: key
    })

Сначала нужно сгруппировать по критериям, по которым вы хотите сгруппировать.В вашем случае ConcatenatedString.Это возвращает

{
  "chair,table,bed": [
    {
      "Key": "Name",
      "Value": "Furniture",
      "ConcatenatedString": "chair,table,bed"
    },
    {
      "Key": "Status",
      "Value": "Good",
      "ConcatenatedString": "chair,table,bed"
    }
  ],
  "apple,orange,pineapple": [
    {
      "Key": "Name",
      "Value": "Fruit",
      "ConcatenatedString": "apple,orange,pineapple"
    },
    {
      "Key": "Status",
      "Value": "Good",
      "ConcatenatedString": "apple,orange,pineapple"
    },
    {
      "Key": "Edible",
      "Value": "Yes",
      "ConcatenatedString": "apple,orange,pineapple"
    }
  ]
}

И затем вы повторяете с pluck по каждой паре key value и фильтруете элементы, которые хотите отобразить.

...