Step "Mapper" mit APICall und Datastore zusammenführen

Hallo,

ich habe ein Step „ApiCall“, wo beispielsweise die Daten wie folgt rein kommen:

Nr. | Platz | Bestand

145 | 10 | 1
145 | 11 | 2
145 | 12 | 3
145 | 12 | 1

Nun möchte ich, dass diese Daten in ein einziges Feld meines anderen Datastores eingetragen werden, indem die Nr. 145 bereits existiert.

Am Besten so:

10;1|11;2|12;3|12;1

Die Formatierung funktioniert, aber wenn ich das über den Mapper mache, gewinnt bei mir immer nur der letzte Datensatz, so dass nur dieser eingetragen wird.

Ich finde für mich da leider auch keine passenden Funktionen, wie ich das lösen könnte.

Meine Steps:

  1. ApiCall
  2. XmlReader
  3. Filter
  4. Mapper
  5. DatastoreWriter

Beste Grüße

Ich habe glaube es jetzt selbst gefunden. Die Gruppierungsfunktion über Einstellung.

Ich gruppiere „Nr.“ und erhalte dann …

10;11;12;12 in Spalte B
1;2;3;1 in Spalte C

Nun müssten nur noch die beiden 12er-Werte und dessen Bestand zusammengeführt werden.

Habe ich dann über Freemarker gemacht:

<#assign platz = Platz?split(";")>
<#assign bestand = Bestand?split(";")>

<#assign grouped = {}>

<#list 0..(platz?size - 1) as i>
  <#assign key = platz[i]>
  <#assign value = bestand[i]?number>
  
  <#if grouped[key]??>
    <#assign grouped = grouped + {key: grouped[key] + value}>
  <#else>
    <#assign grouped = grouped + {key: value}>
  </#if>
</#list>

<#assign output = []>
<#list grouped?keys?sort as key>
  <#assign output += [key + ";" + grouped[key]]>
</#list>

${output?join("|")}

Ergebnis:
10;1|11;2|12;4

Hallo @Lemm,

wenn deine Lösung funktioniert ist das super, ich würde aber noch einen simpleren Weg zeigen wie du es mit unseren eingebauten Funktionen lösen kannst:

Dabei musst du natürlich nach Nr. gruppieren.

Drum herum kannst du aber auch noch Skript nutzen um zum Beispiel leere Werte zu entfernen.

Viele Grüße
Lukas

1 „Gefällt mir“

Hallo Lukas,

der Weg ist schmaler und besser. :+1:

Danke.