2017-01-16 5 views
0

Я использую Anypoint Studio 6.1 и Mule 3.8.1 и в Dataweave У меня есть файл CSV в качестве входного и выходного списка JSON.Объединить записи в один объект JSON для каждой категории с использованием Dataweave

Несколько записей поступают в файл CSV с одинаковым идентификатором категории продукта, но будут иметь разные детали продукта, связанные с ним. Я хочу, чтобы мой результат был агрегирован для каждой из этих записей, поэтому у меня есть один объект для каждого идентификатора категории продуктов, который содержит список деталей продукта для каждого продукта под этим идентификатором категории продуктов. Как я могу это сделать?

Токовый выход:

[ 
    { 
    "Products": { 
     "ProductDetails": [ 
     { 
      "ProductDetail": { 
      "ProductSubDetails": { 
       "ProductAmount": 7.50, 
       "ProductReplenFrequency": "monthly", 
       "ProductsNotes": "Product Notes 1", 
       "pick": false 
      }, 
      "ProductType": "PS4 Game" 
      }, 
      "ProductSubType": "Game" 
     } 
     ] 
    }, 
    "ProductsCategoryId": "ProductS001", 
    "ProductSubType": "Computers and Games" 
    }, 
    { 
    "Products": { 
     "ProductDetails": [ 
     { 
      "ProductDetail": { 
      "ProductSubDetails": { 
       "ProductAmount": 7.50, 
       "ProductReplenFrequency": "fortnightly", 
       "ProductsNotes": "Products Notes 2", 
       "pick": false 
      }, 
      "ProductType": "X Box One Game" 
      }, 
      "ProductSubType": "Game" 
     } 
     ] 
    }, 
    "ProductsCategoryId": "ProductS001", 
    "ProductSubType": "Computers and Games" 
    } 
] 

Ожидаемый результат:

[ 
    { 
    "Products": { 
     "ProductDetails": [ 
     { 
      "ProductDetail": { 
      "ProductSubDetails": { 
       "ProductAmount": 7.50, 
       "ProductReplenFrequency": "monthly", 
       "ProductsNotes": "Product Notes 1", 
       "pick": false 
      }, 
      "ProductType": "PS4 Game" 
      }, 
      "ProductSubType": "Game" 
     }, 
     { 
      "ProductDetail": { 
      "ProductSubDetails": { 
       "ProductAmount": 7.50, 
       "ProductReplenFrequency": "fortnightly", 
       "ProductsNotes": "Products Notes 2", 
       "pick": false 
      }, 
      "ProductType": "X Box One Game" 
      }, 
      "ProductSubType": "Game" 
     }  
     ] 
    }, 
    "ProductsIdentifier": "ProductS001", 
    "ProductSubType": "Computers and Games" 
    } 
] 

Dataweave код:

%dw 1.0 
%input payload application/csv 
%output application/json skipNullOn = "everywhere" , encoding = "UTF-8" 
%var dataLookup = {(payload."ProductsCategoryId" map {($.Id): $.Value})} 

--- 
(payload filter $$ > 2) map ((payload01 , indexOfPayload01) -> { 
    Products: { 
     ProductsDetails: [{ 
      ProductsDetail: { 
       ProductsubDetails: { 
        ProductsAmount: payload01."Products Amount" as :number, 
        ProductsFrequency: payload01."Products Frequency" 
       }, 
       ProductsType: payload01."Products Type" 
      } 
     }] 
    }, 
    ProductsCategoryId: payload01."ProductsCategoryId" 
}) 

Образец данных:

ProductsCategoryId,Product Type,Product Frequency,Product Amount 
ProductS001,PS4 Game,Monthly,7.5 
ProductS001,X Box One Game,Fortnightly,7.5 
ProductS002,Lego,Daily,7 

Благодаря

+0

Не могли бы вы также предоставить некоторый образец ввода? –

+0

Я добавил образцы данных csv с двумя записями с одинаковым идентификатором категории продуктов. Я смотрел команды группы и сглаживания, но не смог получить правильный результат. – user3165854

ответ

0

Вы должны использовать искать для достижения желаемых результатов. Пожалуйста, обратитесь следующий ответ для более подробной информации

Lookup list of Maps variable in data weave script

Обновленный ответ согласно комментариям

Попробовать следующее отображение. Кроме того, я не знаю, почему у вас есть использовать фильтр $$> 2. Для тела начинается в строке 5 вы можете добавить Считыватель свойство «bodyStartLineNumber» Пожалуйста, обратитесь link для получения более подробной информации

%dw 1.0 
%input payload application/csv 
%output application/json skipNullOn = "everywhere" , encoding = "UTF-8" 
--- 
payload groupBy $.ProductsCategoryId map { 
    Products: { 
     ProductsDetails: $ map (product , indexOfProduct) -> { 
      ProductsDetail: { 
       ProductsubDetails: { 
        ProductsAmount: product."Product Amount" as :number, 
        ProductsFrequency: product."Product Frequency" 
       }, 
       ProductsType: product."Product Type" 
      } 
     } 
    }, 
    ProductsCategoryId: $."ProductsCategoryId"[0] 
} 

Выход gnerated: -

[ 
    { 
    "Products": { 
     "ProductsDetails": [ 
     { 
      "ProductsDetail": { 
      "ProductsubDetails": { 
       "ProductsAmount": 7 
      }, 
      "ProductsType": "Lego" 
      } 
     } 
     ] 
    }, 
    "ProductsCategoryId": "ProductS002" 
    }, 
    { 
    "Products": { 
     "ProductsDetails": [ 
     { 
      "ProductsDetail": { 
      "ProductsubDetails": { 
       "ProductsAmount": 7.5 
      }, 
      "ProductsType": "PS4 Game" 
      } 
     }, 
     { 
      "ProductsDetail": { 
      "ProductsubDetails": { 
       "ProductsAmount": 7.5 
      }, 
      "ProductsType": "X Box One Game" 
      } 
     } 
     ] 
    }, 
    "ProductsCategoryId": "ProductS001" 
    } 
] 

HTH

+0

Я вижу ошибку с решением, когда пытаюсь использовать функцию dataLookup, которая «Не может принуждать: null к ключу:». Я обновил код в вопросе и файл csv до меньшего количества полей. Знаете ли вы, что это может вызвать и как я могу игнорировать нули? Следует отметить, что тело начинается с строки 5 в файле CSV. – user3165854

+0

Кроме того, есть ли какая-либо документация вокруг функции dataLookup. Борясь, чтобы найти любой, чтобы помочь изучить этот вопрос – user3165854

Смежные вопросы