Yes, that is possible. You’ll need a minimum of six modules:
Hope this helps! Let me know if there are any further questions or issues.
Click to Expand Module Export Code
JSON - Copy and Paste this directly in the scenario editor
{
"subflows": [
{
"flow": [
{
"id": 174,
"module": "csv:ParseCSV",
"version": 1,
"parameters": {
"colCount": null,
"csvContainsHeaders": true,
"delimiterType": "other",
"relax": false,
"delimiter": ","
},
"mapper": {
"csv": "Code magasin,Nom Rayon,Nombre de produits,Couverture Prévision 1,Couverture Prévision 2\n5202,EPICERIE,3043,\"9,021,529\",\"89,220,993\"\n5202,FRAIS,783,\"105,048,366\",\"99,020,751\"\n1628,EPICERIE,3604,\"83,297,063\",\"93,163,375\"\n1628,FRAIS,725,\"96,207,126\",\"101,167,498\""
},
"metadata": {
"designer": {
"x": 2748,
"y": -3271
},
"restore": {
"parameters": {
"delimiterType": {
"label": "Other"
}
}
},
"parameters": [
{
"name": "colCount",
"type": "number",
"label": "Number of columns"
},
{
"name": "csvContainsHeaders",
"type": "boolean",
"label": "CSV contains headers",
"required": true
},
{
"name": "delimiterType",
"type": "select",
"label": "Delimiter",
"required": true,
"validate": {
"enum": [
",",
"\t",
"other"
]
}
},
{
"name": "relax",
"type": "boolean",
"label": "Preserve quotes inside unquoted field",
"required": true
},
{
"name": "delimiter",
"type": "text",
"label": "Delimiter character",
"validate": {
"max": 1,
"min": 1
},
"required": true
}
],
"expect": [
{
"name": "csv",
"type": "text",
"label": "CSV",
"required": true
}
],
"interface": [
{
"name": "col1",
"label": "Code magasin",
"type": "text"
},
{
"name": "col2",
"label": "Nom Rayon",
"type": "text"
},
{
"name": "col3",
"label": "Nombre de produits",
"type": "text"
},
{
"name": "col4",
"label": "Couverture Prévision 1",
"type": "text"
},
{
"name": "col5",
"label": "Couverture Prévision 2",
"type": "text"
}
]
}
},
{
"id": 175,
"module": "builtin:BasicAggregator",
"version": 1,
"parameters": {
"feeder": 174
},
"mapper": {
"col1": "{{174.col1}}",
"col2": "{{174.col2}}",
"col3": "{{174.col3}}",
"col4": "{{174.col4}}",
"col5": "{{174.col5}}"
},
"metadata": {
"designer": {
"x": 2990,
"y": -3270,
"name": "Group By Code"
},
"restore": {
"extra": {
"feeder": {
"label": "CSV - Parse CSV [174]"
},
"target": {
"label": "Custom"
}
}
},
"advanced": true
},
"flags": {
"groupBy": "{{174.col1}}"
}
},
{
"id": 177,
"module": "builtin:BasicFeeder",
"version": 1,
"parameters": {},
"mapper": {
"array": "{{175.array}}"
},
"metadata": {
"designer": {
"x": 3235,
"y": -3273,
"name": "Iterate Rayons"
},
"restore": {
"expect": {
"array": {
"mode": "edit"
}
}
},
"expect": [
{
"name": "array",
"type": "array",
"label": "Array",
"mode": "edit",
"spec": []
}
]
}
},
{
"id": 178,
"module": "util:TextAggregator",
"version": 1,
"parameters": {
"rowSeparator": "other",
"otherRowSeparator": ",",
"feeder": 177
},
"mapper": {
"value": "{\n \"Nom Rayon\": \"{{177.col2}}\",\n \"Produits\": [\n {\n \"Code magasin\": {{177.col1}},\n \"Nom Rayon\": \"{{177.col2}}\",\n \"Nombre de produits\": \"{{177.col3}}\",\n \"Couverture Prévision 1\": \"{{177.col4}}\",\n \"Couverture Prévision 2\": \"{{177.col5}}\"\n }\n ]\n}"
},
"metadata": {
"designer": {
"x": 3482,
"y": -3274,
"name": "Aggregate Rayons"
},
"restore": {
"parameters": {
"rowSeparator": {
"label": "Other"
}
},
"extra": {
"feeder": {
"label": "Iterate Rayons [177]"
}
},
"flags": {
"groupBy": {
"collapsed": true
},
"stopIfEmpty": {
"collapsed": true
}
}
},
"parameters": [
{
"name": "rowSeparator",
"type": "select",
"label": "Row separator",
"validate": {
"enum": [
"\n",
"\t",
"other"
]
}
},
{
"name": "otherRowSeparator",
"type": "text",
"label": "Separator"
}
],
"expect": [
{
"name": "value",
"type": "text",
"label": "Text"
}
],
"advanced": true
}
},
{
"id": 176,
"module": "util:TextAggregator",
"version": 1,
"parameters": {
"rowSeparator": "other",
"otherRowSeparator": ",",
"feeder": 175
},
"mapper": {
"value": "{\n \"Code magasin\": {{175.`__IMTKEY__`}},\n \"Rayons\": [\n {{178.text}}\n ]\n}"
},
"metadata": {
"designer": {
"x": 3728,
"y": -3275,
"name": "Aggregate Code"
},
"restore": {
"parameters": {
"rowSeparator": {
"label": "Other"
}
},
"extra": {
"feeder": {
"label": "Array aggregator [175]"
}
},
"flags": {
"groupBy": {
"collapsed": true
},
"stopIfEmpty": {
"collapsed": true
}
}
},
"parameters": [
{
"name": "rowSeparator",
"type": "select",
"label": "Row separator",
"validate": {
"enum": [
"\n",
"\t",
"other"
]
}
},
{
"name": "otherRowSeparator",
"type": "text",
"label": "Separator"
}
],
"expect": [
{
"name": "value",
"type": "text",
"label": "Text"
}
],
"advanced": true
}
},
{
"id": 180,
"module": "util:SetVariable2",
"version": 1,
"parameters": {},
"mapper": {
"name": "json",
"scope": "roundtrip",
"value": "[{{176.text}}]"
},
"metadata": {
"designer": {
"x": 3971,
"y": -3277,
"name": "Build JSON"
},
"restore": {
"expect": {
"scope": {
"label": "One cycle"
}
}
},
"expect": [
{
"name": "name",
"type": "text",
"label": "Variable name",
"required": true
},
{
"name": "scope",
"type": "select",
"label": "Variable lifetime",
"required": true,
"validate": {
"enum": [
"roundtrip",
"execution"
]
}
},
{
"name": "value",
"type": "any",
"label": "Variable value"
}
],
"interface": [
{
"name": "json",
"label": "json",
"type": "any"
}
]
}
}
]
}
],
"metadata": {
"version": 1
}
}
Hope this helps! Let me know if there are any further questions or issues.